<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wc="https://wilhelm.codes/ns/feed/1.0"><channel><title>Wilhelm Codes · Js</title><link>https://wilhelm.codes/tags/js/</link><description>Slinger of nibbles, bits and bytes. Over 25 years of professional experience as a software engineer. Love making glowing rectangles go "beep-boop".</description><generator>Hugo</generator><language>en-US</language><managingEditor>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</managingEditor><webMaster>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</webMaster><lastBuildDate>Thu, 29 Sep 2022 00:00:00 +0000</lastBuildDate><atom:link href="https://wilhelm.codes/tags/js/index.xml" rel="self" type="application/rss+xml"/><item><title>Filtering Docker Containers with jq</title><link>https://wilhelm.codes/blog/filtering-docker-containers-with-jq/</link><pubDate>Thu, 29 Sep 2022 00:00:00 +0000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/blog/filtering-docker-containers-with-jq/</guid><category>docker</category><category>js</category><category>json</category><category>bash</category><wc:kind>post</wc:kind><description>As is the case with any seasoned DevOps engineer, I have a set of tools in my kit that I simply cannot live without. If I had to distill them into a top-5 list it would be the following.</description><content:encoded><![CDATA[<p>As is the case with any seasoned DevOps engineer, I have a set of tools in my kit that I simply cannot live without. If I had to distill them into a top-5 list it would be the following.</p>
<ol>
<li>Bash for portability.</li>
<li><a href="https://stedolan.github.io/jq/">jq</a> to filter JSON objects from RESTful APIs.</li>
<li>AWS CLI as I cannot stand dealing with the web console.</li>
<li><code>curl</code> ( with <code>wget</code> as a reasonable fallback ) to interact with various APIs.</li>
<li><a href="https://www.terraform.io/">Terraform</a> for <em>most</em> of my IaC needs.</li>
</ol>
<p>It wouldn’t be an exaggeration to say I <em>literally</em> use these tools <em>every</em> day. Specifically, the first 3 items. Furthermore, to say that manually sorting through Docker containers is a practice in tedium would be a massive understatement. Because of this, not a day passes where I am not grateful to have found <code>jq</code>.</p>
<p>In this case, my favourite duo <em>is</em> Docker and <code>jq</code>&hellip; which is what this article is about. Let’s learn some fun filtering patterns to make your life a bit easier if you’re stuck in a terminal all day like myself.</p>
<h2 id="setting-up">
  <a class="heading-link" href="#setting-up">Setting Up<span class="heading-anchor" aria-hidden="true">#</span>
  </a>
</h2>
<p>First and foremost, you’re going to need to install <code>jq</code> in your test environment. If you’re on most common Linux distributions:</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">Bash</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">apt-get install jq</span></span></code></pre></div>
</div>
<p>Or, on MacOS:</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">Bash</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">brew update <span class="o">&amp;&amp;</span> brew install jq</span></span></code></pre></div>
</div>
<p>I’m assuming that if you’re reading this you already have Docker installed in your test environment. If not, head out to their website and read their <a href="https://docs.docker.com/get-docker/">installation documentation</a>. It tends to vary wildly depending on your OS.</p>
<p>Let’s spin up some containers we can play around with. I use <code>redis</code> for stuff like this:</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">Bash</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="k">for</span> i in <span class="o">{</span>1..5<span class="o">}</span><span class="p">;</span> <span class="k">do</span> docker run -it --rm -d redis<span class="p">;</span> <span class="k">done</span></span></span></code></pre></div>
</div>
<h2 id="environmental-variables">
  <a class="heading-link" href="#environmental-variables">Environmental Variables<span class="heading-anchor" aria-hidden="true">#</span>
  </a>
</h2>
<h3 id="sourceable-blocks">
  <a class="heading-link" href="#sourceable-blocks">Sourceable Blocks<span class="heading-anchor" aria-hidden="true">#</span>
  </a>
</h3>
<p>There may be times I wish to collate all environmental variables associated with a set of containers and stick them a <code>.env</code> file to source later. Here we create a block for all the <code>redis</code> containers we just spun up:</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">Bash</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker inspect <span class="k">$(</span>docker ps -q<span class="k">)</span> <span class="p">|</span> jq -r <span class="s1">&#39;
</span></span></span><span class="line"><span class="cl"><span class="s1">    .[].Config.Env
</span></span></span><span class="line"><span class="cl"><span class="s1">  | flatten 
</span></span></span><span class="line"><span class="cl"><span class="s1">  | .[]
</span></span></span><span class="line"><span class="cl"><span class="s1">&#39;</span></span></span></code></pre></div>
</div>
<p>This one will generate a lot of duplicates as all our test containers are effectively clones. What if we want a distinct set of instead? We can use the <code>unique</code> filter:</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">Bash</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker inspect <span class="k">$(</span>docker ps -q<span class="k">)</span> <span class="p">|</span> jq -r <span class="s1">&#39;
</span></span></span><span class="line"><span class="cl"><span class="s1">	[
</span></span></span><span class="line"><span class="cl"><span class="s1">	  .[].Config.Env
</span></span></span><span class="line"><span class="cl"><span class="s1">	] 
</span></span></span><span class="line"><span class="cl"><span class="s1">  | flatten 
</span></span></span><span class="line"><span class="cl"><span class="s1">  | unique 
</span></span></span><span class="line"><span class="cl"><span class="s1">  | .[]
</span></span></span><span class="line"><span class="cl"><span class="s1">&#39;</span></span></span></code></pre></div>
</div>
<p>What if I want a set from specific containers?</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">Bash</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker inspect <span class="k">$(</span>docker ps -q<span class="k">)</span> <span class="p">|</span> jq -r <span class="s1">&#39;
</span></span></span><span class="line"><span class="cl"><span class="s1">    [
</span></span></span><span class="line"><span class="cl"><span class="s1">	    .[] 
</span></span></span><span class="line"><span class="cl"><span class="s1">      | select([.Id] | inside([
</span></span></span><span class="line"><span class="cl"><span class="s1">	      &#34;747c2c92855f88a8e9aa9709dcdf3a01f1677e70bf4c0bf0e520eb38ac502876&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">	      &#34;2cf70261ef62bc36d19aba02f8ef7b8d7aabfcb1e9f4593a919baa17f80aca5b&#34;
</span></span></span><span class="line"><span class="cl"><span class="s1">	    ]))
</span></span></span><span class="line"><span class="cl"><span class="s1">      | .Config.Env
</span></span></span><span class="line"><span class="cl"><span class="s1">	] 
</span></span></span><span class="line"><span class="cl"><span class="s1">  | flatten 
</span></span></span><span class="line"><span class="cl"><span class="s1">  | unique 
</span></span></span><span class="line"><span class="cl"><span class="s1">  | .[]
</span></span></span><span class="line"><span class="cl"><span class="s1">&#39;</span></span></span></code></pre></div>
</div>
<p>How about filtering by a specific ip address for the default <code>bridge</code> network? Using a different network? Just replace <code>bridge</code> with the alternate network name.</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">Bash</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker inspect <span class="k">$(</span>docker ps -q<span class="k">)</span> <span class="p">|</span> jq -r <span class="s1">&#39;
</span></span></span><span class="line"><span class="cl"><span class="s1">    .[] 
</span></span></span><span class="line"><span class="cl"><span class="s1">  | select(.NetworkSettings.Networks.bridge.IPAddress == &#34;172.17.0.2&#34;) 
</span></span></span><span class="line"><span class="cl"><span class="s1">  | .Config.Env 
</span></span></span><span class="line"><span class="cl"><span class="s1">  | .[]
</span></span></span><span class="line"><span class="cl"><span class="s1">&#39;</span></span></span></code></pre></div>
</div>
<p>Multiple ip addresses?</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">Bash</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker inspect <span class="k">$(</span>docker ps -q<span class="k">)</span> <span class="p">|</span> jq -r <span class="s1">&#39;
</span></span></span><span class="line"><span class="cl"><span class="s1">    .[] 
</span></span></span><span class="line"><span class="cl"><span class="s1">  | select([.NetworkSettings.Networks.bridge.IPAddress] 
</span></span></span><span class="line"><span class="cl"><span class="s1">  | inside([
</span></span></span><span class="line"><span class="cl"><span class="s1">      &#34;172.17.0.2&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">      &#34;172.17.0.3&#34;
</span></span></span><span class="line"><span class="cl"><span class="s1">    ])) 
</span></span></span><span class="line"><span class="cl"><span class="s1">  | .Config.Env 
</span></span></span><span class="line"><span class="cl"><span class="s1">  | .[]
</span></span></span><span class="line"><span class="cl"><span class="s1">&#39;</span></span></span></code></pre></div>
</div>
<h3 id="as-flags-instead">
  <a class="heading-link" href="#as-flags-instead">As Flags Instead<span class="heading-anchor" aria-hidden="true">#</span>
  </a>
</h3>
<p>Here’s a strange one I’ve had to do. What if we want to recreate a list of <code>--env</code> flags we could pass to other <code>docker run ...</code> commands?</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">Bash</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker inspect <span class="k">$(</span>docker ps -q<span class="k">)</span> <span class="p">|</span> jq -r <span class="s1">&#39;
</span></span></span><span class="line"><span class="cl"><span class="s1">    [
</span></span></span><span class="line"><span class="cl"><span class="s1">        [
</span></span></span><span class="line"><span class="cl"><span class="s1">          .[].Config.Env
</span></span></span><span class="line"><span class="cl"><span class="s1">        ] 
</span></span></span><span class="line"><span class="cl"><span class="s1">      | flatten 
</span></span></span><span class="line"><span class="cl"><span class="s1">      | unique 
</span></span></span><span class="line"><span class="cl"><span class="s1">      | &#34;--env=\(.[])&#34;
</span></span></span><span class="line"><span class="cl"><span class="s1">    ] 
</span></span></span><span class="line"><span class="cl"><span class="s1">  | join(&#34; &#34;)
</span></span></span><span class="line"><span class="cl"><span class="s1">&#39;</span></span></span></code></pre></div>
</div>
<p>You’ll get a string that looks similar to the following.</p>
<div class="code-block">
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">--env=GOSU_VERSION=1.14 --env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin --env=REDIS_DOWNLOAD_SHA=f0e65fda74c44a3dd4fa9d512d4d4d833dd0939c934e946a5c622a630d057f2f --env=REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-7.0.4.tar.gz --env=REDIS_VERSION=7.0.4</span></span></code></pre></div>
</div>
<h2 id="filtering-by-relative-time">
  <a class="heading-link" href="#filtering-by-relative-time">Filtering By Relative Time<span class="heading-anchor" aria-hidden="true">#</span>
  </a>
</h2>
<p>I’ve had to use these several times for things like garbage collecting and cleaning up long-running containers. This uses a bit of Bash to help generate the relative timestamps. We use the <code>date</code> command for this, but if you’re on a <code>darwin</code>-based OS you’ll need to install <code>gdate</code> first via Homebrew with:</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">Bash</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">brew install coreutils</span></span></code></pre></div>
</div>
<p>Substitute the following calls to <code>date</code> with <code>gdate</code> below if on MacOS.</p>
<h3 id="newer-than-">
  <a class="heading-link" href="#newer-than-">Newer Than …<span class="heading-anchor" aria-hidden="true">#</span>
  </a>
</h3>
<p>Filtering out recent containers with relative time is fairly straight-forward. The following gives us all containers created in the last hour as JSON output from <code>docker inspect ...</code>:</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">Bash</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">threshold</span><span class="o">=</span><span class="k">$(</span>date -d <span class="s2">&#34;1 hour ago&#34;</span> +%s<span class="k">)</span>
</span></span><span class="line"><span class="cl">docker inspect <span class="k">$(</span>docker ps -q<span class="k">)</span> <span class="p">|</span> jq --argjson threshold <span class="s2">&#34;</span><span class="si">${</span><span class="nv">threshold</span><span class="si">}</span><span class="s2">&#34;</span> -r <span class="s1">&#39;
</span></span></span><span class="line"><span class="cl"><span class="s1">    .[] 
</span></span></span><span class="line"><span class="cl"><span class="s1">  | select((.State.StartedAt | split(&#34;.&#34;)[0] | &#34;\(.)Z&#34; | fromdate) &gt; $threshold)
</span></span></span><span class="line"><span class="cl"><span class="s1">&#39;</span></span></span></code></pre></div>
</div>
<p>Perhaps you just want the names of the containers instead:</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">Bash</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">threshold</span><span class="o">=</span><span class="k">$(</span>date -d <span class="s2">&#34;1 hour ago&#34;</span> +%s<span class="k">)</span>
</span></span><span class="line"><span class="cl">docker inspect <span class="k">$(</span>docker ps -q<span class="k">)</span> <span class="p">|</span> jq --argjson threshold <span class="s2">&#34;</span><span class="si">${</span><span class="nv">threshold</span><span class="si">}</span><span class="s2">&#34;</span> -r <span class="s1">&#39;
</span></span></span><span class="line"><span class="cl"><span class="s1">    .[] 
</span></span></span><span class="line"><span class="cl"><span class="s1">  | select((.State.StartedAt | split(&#34;.&#34;)[0] | &#34;\(.)Z&#34; | fromdate) &gt; $threshold)
</span></span></span><span class="line"><span class="cl"><span class="s1">  | .Name[1:]
</span></span></span><span class="line"><span class="cl"><span class="s1">&#39;</span></span></span></code></pre></div>
</div>
<p>Docker likes to put a <code>/</code> at the beginning of each generated container pet name, so we use <code>.Name[1:]</code> to snip it off.</p>
<p>What about just returning the associated ids?</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">Bash</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">threshold</span><span class="o">=</span><span class="k">$(</span>date -d <span class="s2">&#34;1 hour ago&#34;</span> +%s<span class="k">)</span>
</span></span><span class="line"><span class="cl">docker inspect <span class="k">$(</span>docker ps -q<span class="k">)</span> <span class="p">|</span> jq --argjson threshold <span class="s2">&#34;</span><span class="si">${</span><span class="nv">threshold</span><span class="si">}</span><span class="s2">&#34;</span> -r <span class="s1">&#39;
</span></span></span><span class="line"><span class="cl"><span class="s1">    .[] 
</span></span></span><span class="line"><span class="cl"><span class="s1">  | select((.State.StartedAt | split(&#34;.&#34;)[0] | &#34;\(.)Z&#34; | fromdate) &gt; $threshold)
</span></span></span><span class="line"><span class="cl"><span class="s1">  | .Id
</span></span></span><span class="line"><span class="cl"><span class="s1">&#39;</span></span></span></code></pre></div>
</div>
<p>Or, ip addresses:</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">Bash</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">threshold</span><span class="o">=</span><span class="k">$(</span>date -d <span class="s2">&#34;1 hour ago&#34;</span> +%s<span class="k">)</span>
</span></span><span class="line"><span class="cl">docker inspect <span class="k">$(</span>docker ps -q<span class="k">)</span> <span class="p">|</span> jq --argjson threshold <span class="s2">&#34;</span><span class="si">${</span><span class="nv">threshold</span><span class="si">}</span><span class="s2">&#34;</span> -r <span class="s1">&#39;
</span></span></span><span class="line"><span class="cl"><span class="s1">    .[] 
</span></span></span><span class="line"><span class="cl"><span class="s1">  | select((.State.StartedAt | split(&#34;.&#34;)[0] | &#34;\(.)Z&#34; | fromdate) &gt; $threshold)
</span></span></span><span class="line"><span class="cl"><span class="s1">  | .NetworkSettings.Networks.bridge.IPAddress
</span></span></span><span class="line"><span class="cl"><span class="s1">&#39;</span></span></span></code></pre></div>
</div>
<h3 id="older-than">
  <a class="heading-link" href="#older-than">Older Than???<span class="heading-anchor" aria-hidden="true">#</span>
  </a>
</h3>
<p>The same filters apply, but you’re just flipping the compare operator from <code>&gt;</code> to <code>&lt;</code>:</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">Bash</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">threshold</span><span class="o">=</span><span class="k">$(</span>date -d <span class="s2">&#34;1 hour ago&#34;</span> +%s<span class="k">)</span>
</span></span><span class="line"><span class="cl">docker inspect <span class="k">$(</span>docker ps -q<span class="k">)</span> <span class="p">|</span> jq --argjson threshold <span class="s2">&#34;</span><span class="si">${</span><span class="nv">threshold</span><span class="si">}</span><span class="s2">&#34;</span> -r <span class="s1">&#39;
</span></span></span><span class="line"><span class="cl"><span class="s1">    .[] 
</span></span></span><span class="line"><span class="cl"><span class="s1">  | select((.State.StartedAt | split(&#34;.&#34;)[0] | &#34;\(.)Z&#34; | fromdate) &lt; $threshold)
</span></span></span><span class="line"><span class="cl"><span class="s1">&#39;</span></span></span></code></pre></div>
</div>
<h2 id="other-common-patterns">
  <a class="heading-link" href="#other-common-patterns">Other Common Patterns<span class="heading-anchor" aria-hidden="true">#</span>
  </a>
</h2>
<p>There have been times where I need a block of container ip addresses so I can dynamically update some Nginx upstreams somewhere. With <code>jq</code> it’s as easy as:</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">Bash</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker inspect <span class="k">$(</span>docker ps -q<span class="k">)</span> <span class="p">|</span> jq -r <span class="s1">&#39;
</span></span></span><span class="line"><span class="cl"><span class="s1">  .[].NetworkSettings.Networks.bridge.IPAddress
</span></span></span><span class="line"><span class="cl"><span class="s1">&#39;</span></span></span></code></pre></div>
</div>
<p>The output would look something like this:</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">Bash</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">172.17.0.6
</span></span><span class="line"><span class="cl">172.17.0.5
</span></span><span class="line"><span class="cl">172.17.0.4
</span></span><span class="line"><span class="cl">172.17.0.3
</span></span><span class="line"><span class="cl">172.17.0.2</span></span></code></pre></div>
</div>
<p>Perhaps, I want to find a specific container id by it’s ip address:</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">Bash</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker inspect <span class="k">$(</span>docker ps -q<span class="k">)</span> <span class="p">|</span> jq -r <span class="s1">&#39;
</span></span></span><span class="line"><span class="cl"><span class="s1">	.[]
</span></span></span><span class="line"><span class="cl"><span class="s1">  | select(.NetworkSettings.Networks.bridge.IPAddress == &#34;172.17.0.3&#34;)
</span></span></span><span class="line"><span class="cl"><span class="s1">  | .Id
</span></span></span><span class="line"><span class="cl"><span class="s1">&#39;</span></span></span></code></pre></div>
</div>
<p>Or, just give me the names of all running containers:</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">Bash</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker inspect <span class="k">$(</span>docker ps -q<span class="k">)</span> <span class="p">|</span> jq -r <span class="s1">&#39;
</span></span></span><span class="line"><span class="cl"><span class="s1">  .[].Name[1:]
</span></span></span><span class="line"><span class="cl"><span class="s1">&#39;</span></span></span></code></pre></div>
</div>
<p>Which would give you something like:</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">Bash</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">zealous_hertz
</span></span><span class="line"><span class="cl">fervent_dijkstra
</span></span><span class="line"><span class="cl">focused_galileo
</span></span><span class="line"><span class="cl">zealous_poincare
</span></span><span class="line"><span class="cl">naughty_wescoff</span></span></code></pre></div>
</div>
<h2 id="cleaning-up-">
  <a class="heading-link" href="#cleaning-up-">Cleaning Up …<span class="heading-anchor" aria-hidden="true">#</span>
  </a>
</h2>
<p>We’re considerate people, so let’s clean up after ourselves by killing all containers created using the <code>redis</code> image:</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">Bash</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker <span class="nb">kill</span> <span class="k">$(</span>docker inspect <span class="k">$(</span>docker ps -q<span class="k">)</span> <span class="p">|</span> jq -r <span class="s1">&#39;
</span></span></span><span class="line"><span class="cl"><span class="s1">	.[] 
</span></span></span><span class="line"><span class="cl"><span class="s1">  | select(.Config.Image == &#34;redis&#34;) 
</span></span></span><span class="line"><span class="cl"><span class="s1">  | .Id
</span></span></span><span class="line"><span class="cl"><span class="s1">&#39;</span><span class="k">)</span></span></span></code></pre></div>
</div>
<p>Keep in mind this will kill <em>all</em> <code>redis</code> containers.</p>
<h2 id="in-closing-">
  <a class="heading-link" href="#in-closing-">In Closing …<span class="heading-anchor" aria-hidden="true">#</span>
  </a>
</h2>
<p>Having a toolbox filled with utilities you can mix and match together is great if you spend most of your day working in a terminal on a glowing rectangle. Hopefully, I’ve made a strong enough case to for Docker and <code>jq</code> as a great combo.</p>
<h2 id="but-wait-theres-more">
  <a class="heading-link" href="#but-wait-theres-more">But, Wait! There’s More!<span class="heading-anchor" aria-hidden="true">#</span>
  </a>
</h2>
<p>Why copy and paste these commands in your terminal, when you could just <a href="https://github.com/wilhelm-murdoch/dq">download and install</a> a handy little Bash script to do it all for you? <code>dq</code> has all the above built-in as well as heaps more bells and whistles.</p>
<p>Here are a few command examples if you’re interested:</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">Bash</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">dq older-than <span class="m">4</span> months --only-return ips --network pebkac
</span></span><span class="line"><span class="cl">dq newer-than <span class="m">2</span> fortnights --only-return ids
</span></span><span class="line"><span class="cl">dq filter <span class="s1">&#39;.[].Name[1:]&#39;</span>
</span></span><span class="line"><span class="cl">dq find-by-ip-address 172.17.0.2 --only-return names --network foo</span></span></code></pre></div>
</div>]]></content:encoded></item></channel></rss>