<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tomoya Amachi</title>
    <description>The latest articles on DEV Community by Tomoya Amachi (@tomoyamachi).</description>
    <link>https://dev.to/tomoyamachi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F45446%2F7b8201a7-0309-4b3d-994e-5e3d70282bdb.jpg</url>
      <title>DEV Community: Tomoya Amachi</title>
      <link>https://dev.to/tomoyamachi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tomoyamachi"/>
    <language>en</language>
    <item>
      <title>The One Thing You Should Do After Building Best-Practice Docker Image (in 3 minutes)</title>
      <dc:creator>Tomoya Amachi</dc:creator>
      <pubDate>Wed, 19 Jun 2019 14:48:22 +0000</pubDate>
      <link>https://dev.to/tomoyamachi/the-one-thing-you-should-do-after-building-best-practice-docker-image-in-3-minutes-3mi4</link>
      <guid>https://dev.to/tomoyamachi/the-one-thing-you-should-do-after-building-best-practice-docker-image-in-3-minutes-3mi4</guid>
      <description>&lt;h1&gt;
  
  
  Overview
&lt;/h1&gt;

&lt;p&gt;Today, many companies tried to use Docker. This article is for wrote/writing &lt;a href="https://docs.docker.com/develop/develop-images/dockerfile_best-practices/"&gt;best-practice Dockerfiles&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I created a tool analyzes your Dockerfile via the built image in 3 minutes.&lt;br&gt;
&lt;a href="https://github.com/goodwithtech/dockle"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8HcfHVsN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/goodwithtech/dockle/raw/master/imgs/logo.png" width="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/goodwithtech/dockle"&gt;Dockle - Container Image Linter for Security, Helping build the Best-Practice Docker Image, Easy to start&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dockle is able to check deeply. (file permissions, credential files...) So, Dockle the best tool to check important rules, especially for security.&lt;/p&gt;

&lt;p&gt;(I'm also the main committer of &lt;a href="https://github.com/future-architect/vuls"&gt;Vuls&lt;/a&gt; and &lt;a href="https://github.com/knqyf263/trivy"&gt;Trivy&lt;/a&gt;. These are famous vulnerability scanners.)&lt;/p&gt;

&lt;p&gt;It's &lt;strong&gt;NOT&lt;/strong&gt; a Dockerfile Linter (like a hadolint).&lt;br&gt;&lt;br&gt;
It's able to check security risks on a container base image too. Dockerfile Linter never does it.&lt;/p&gt;

&lt;p&gt;I hope you &lt;a href="https://github.com/goodwithtech/dockle"&gt;star it&lt;/a&gt;!&lt;/p&gt;
&lt;h1&gt;
  
  
  How to use
&lt;/h1&gt;
&lt;h2&gt;
  
  
  Homebrew (&lt;a href="https://brew.sh/"&gt;Mac&lt;/a&gt; / &lt;a href="https://docs.brew.sh/Homebrew-on-Linux"&gt;Linux&lt;/a&gt;)
&lt;/h2&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DOCKER_CONTENT_TRUST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;span class="nv"&gt;$ &lt;/span&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; test-image:v1 &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;goodwithtech/dockle/dockle
&lt;span class="nv"&gt;$ &lt;/span&gt;dockle test-image:v1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Linux
&lt;/h2&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DOCKER_CONTENT_TRUST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;span class="nv"&gt;$ &lt;/span&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; test-image:v1 &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nv"&gt;$ VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;
 curl &lt;span class="nt"&gt;--silent&lt;/span&gt; &lt;span class="s2"&gt;"https://api.github.com/repos/goodwithtech/dockle/releases/latest"&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;'"tag_name":'&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'s/.*"v([^"]+)".*/\1/'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; dockle.tar.gz https://github.com/goodwithtech/dockle/releases/download/v&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/dockle_&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;_Linux-64bit.tar.gz
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;tar &lt;/span&gt;zxvf dockle.tar.gz
&lt;span class="nv"&gt;$ &lt;/span&gt;./dockle test-image:v1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Windows
&lt;/h2&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DOCKER_CONTENT_TRUST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;span class="nv"&gt;$ &lt;/span&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; test-image:v1 &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nv"&gt;$ VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;
 curl &lt;span class="nt"&gt;--silent&lt;/span&gt; &lt;span class="s2"&gt;"https://api.github.com/repos/goodwithtech/dockle/releases/latest"&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;'"tag_name":'&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'s/.*"v([^"]+)".*/\1/'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; dockle.zip https://github.com/goodwithtech/dockle/releases/download/v&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/dockle_&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;_Windows-64bit.zip
&lt;span class="nv"&gt;$ &lt;/span&gt;unzip dockle.zip &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm &lt;/span&gt;dockle.zip
&lt;span class="nv"&gt;$ &lt;/span&gt;./dockle.exe test-image:v1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  via Docker
&lt;/h2&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;
 curl &lt;span class="nt"&gt;--silent&lt;/span&gt; &lt;span class="s2"&gt;"https://api.github.com/repos/goodwithtech/dockle/releases/latest"&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;'"tag_name":'&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'s/.*"v([^"]+)".*/\1/'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; /var/run/docker.sock:/var/run/docker.sock &lt;span class="se"&gt;\&lt;/span&gt;
 goodwithtech/dockle:v&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; test-image:v1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;You only need -v /var/run/docker.sock:/var/run/docker.sock when you'd like to scan the image on your host machine.&lt;/p&gt;
&lt;h1&gt;
  
  
  Results
&lt;/h1&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;PASS    - CIS-DI-0001&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create a user for the container&lt;/span&gt;
&lt;span class="na"&gt;PASS    - CIS-DI-0005&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Enable Content trust for Docker&lt;/span&gt;
&lt;span class="na"&gt;PASS    - CIS-DI-0006&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Add HEALTHCHECK instruction to the container image&lt;/span&gt;
&lt;span class="na"&gt;PASS    - CIS-DI-0007&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Do not use update instructions alone in the Dockerfile&lt;/span&gt;
&lt;span class="na"&gt;PASS    - CIS-DI-0008&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Remove setuid and setgid permissions in the images&lt;/span&gt;
&lt;span class="na"&gt;PASS    - CIS-DI-0009&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Use COPY instead of ADD in Dockerfile&lt;/span&gt;
&lt;span class="na"&gt;PASS    - CIS-DI-0010&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Do not store secrets in ENVIRONMENT variables&lt;/span&gt;
&lt;span class="na"&gt;PASS    - CIS-DI-0010&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Do not store secret files&lt;/span&gt;
&lt;span class="na"&gt;PASS    - DKL-DI-0001&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Avoid sudo command&lt;/span&gt;
&lt;span class="na"&gt;PASS    - DKL-DI-0002&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Avoid sensitive directory mounting&lt;/span&gt;
&lt;span class="na"&gt;PASS    - DKL-DI-0003&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Avoid apt-get/apk/dist-upgrade&lt;/span&gt;
&lt;span class="na"&gt;PASS    - DKL-DI-0004&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Use apk add with --no-cache&lt;/span&gt;
&lt;span class="na"&gt;PASS    - DKL-DI-0005&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Clear apt-get caches&lt;/span&gt;
&lt;span class="na"&gt;PASS    - DKL-DI-0006&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Avoid latest tag&lt;/span&gt;
&lt;span class="na"&gt;PASS    - DKL-LI-0001&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Avoid empty password&lt;/span&gt;
&lt;span class="na"&gt;PASS    - DKL-LI-0002&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Be unique UID&lt;/span&gt;
&lt;span class="na"&gt;PASS    - DKL-LI-0002&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Be unique GROUP&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This tool checks &lt;a href="https://www.cisecurity.org/benchmark/docker/"&gt;CIS Benchmarks&lt;/a&gt; and &lt;a href="https://docs.docker.com/develop/develop-images/dockerfile_best-practices/"&gt;Best practices for writing Dockerfiles&lt;br&gt;
&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Dockle shows short messages suggestions for improvement when there are problems.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;WARN    - CIS-DI-0001&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create a user for the container&lt;/span&gt;
        &lt;span class="s"&gt;* Last user should not be root&lt;/span&gt;
&lt;span class="na"&gt;PASS    - CIS-DI-0005&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Enable Content trust for Docker&lt;/span&gt;
&lt;span class="na"&gt;WARN    - CIS-DI-0006&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Add HEALTHCHECK instruction to the container image&lt;/span&gt;
        &lt;span class="s"&gt;* not found HEALTHCHECK statement&lt;/span&gt;
&lt;span class="na"&gt;PASS    - CIS-DI-0007&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Do not use update instructions alone in the Dockerfile&lt;/span&gt;
&lt;span class="na"&gt;INFO    - CIS-DI-0008&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Remove setuid and setgid permissions in the images&lt;/span&gt;
        &lt;span class="s"&gt;* Found setuid file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;usr/lib/openssh/ssh-keysign urwxr-xr-x&lt;/span&gt;
&lt;span class="na"&gt;FATAL   - CIS-DI-0009&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Use COPY instead of ADD in Dockerfile&lt;/span&gt;
        &lt;span class="s"&gt;* Use COPY&lt;/span&gt; &lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/bin/sh -c&lt;/span&gt; &lt;span class="c1"&gt;#(nop) ADD file:81c0a803075715d1a6b4f75a29f8a01b21cc170cfc1bff6702317d1be2fe71a3 in /app/credentials.json&lt;/span&gt;
&lt;span class="na"&gt;FATAL   - CIS-DI-0010&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Do not store secrets in ENVIRONMENT variables&lt;/span&gt;
        &lt;span class="s"&gt;* Suspicious ENV key found&lt;/span&gt; &lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;MYSQL_PASSWD&lt;/span&gt;
&lt;span class="na"&gt;FATAL   - CIS-DI-0010&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Do not store secret files&lt;/span&gt;
        &lt;span class="s"&gt;* Suspicious filename found&lt;/span&gt; &lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app/credentials.json&lt;/span&gt;
&lt;span class="na"&gt;PASS    - DKL-DI-0001&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Avoid sudo command&lt;/span&gt;
&lt;span class="na"&gt;FATAL   - DKL-DI-0002&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Avoid sensitive directory mounting&lt;/span&gt;
        &lt;span class="s"&gt;* Avoid mounting sensitive dirs&lt;/span&gt; &lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/usr&lt;/span&gt;
&lt;span class="na"&gt;PASS    - DKL-DI-0003&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Avoid apt-get/apk/dist-upgrade&lt;/span&gt;
&lt;span class="na"&gt;PASS    - DKL-DI-0004&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Use apk add with --no-cache&lt;/span&gt;
&lt;span class="na"&gt;FATAL   - DKL-DI-0005&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Clear apt-get caches&lt;/span&gt;
        &lt;span class="s"&gt;* Use 'rm -rf /var/lib/apt/lists' after 'apt-get install'&lt;/span&gt; &lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/bin/sh -c apt-get update &amp;amp;&amp;amp; apt-get install -y git&lt;/span&gt;
&lt;span class="na"&gt;PASS    - DKL-DI-0006&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Avoid latest tag&lt;/span&gt;
&lt;span class="na"&gt;FATAL   - DKL-LI-0001&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Avoid empty password&lt;/span&gt;
        &lt;span class="s"&gt;* No password user found! username&lt;/span&gt; &lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nopasswd&lt;/span&gt;
&lt;span class="na"&gt;PASS    - DKL-LI-0002&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Be unique UID&lt;/span&gt;
&lt;span class="na"&gt;PASS    - DKL-LI-0002&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Be unique GROUP&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can check details to searching analysys codes(&lt;code&gt;CIS-DI-0001&lt;/code&gt;...) on &lt;a href="https://github.com/goodwithtech/dockle#checkpoint-detail"&gt;README&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;You don't mind if your image doesn't pass checkpoints.&lt;br&gt;
It's one of an indicator.&lt;/p&gt;

&lt;p&gt;Sometimes you have to run as &lt;code&gt;root&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
Sometimes CLI tool doesn't need &lt;code&gt;HEALTHCHECK&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
Sometimes use &lt;code&gt;ADD&lt;/code&gt; statement when you'd like to add tar files.&lt;/p&gt;

&lt;p&gt;I hope this is reminder that really you'd like to do so.&lt;/p&gt;

&lt;p&gt;You can be specified to ignore rules to give &lt;code&gt;--ignore, -i&lt;/code&gt; option or create &lt;code&gt;.dockleignore&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ dockle -i CIS-DI-0001 -i CIS-DI-0006 [IMAGE_NAME]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# run as root
CIS-DI-0001
# don't use HEALTHCHECK
CIS-DI-0006
# use latest tag
DKL-DI-0006
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Let's do it again.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;IGNORE  - CIS-DI-0001&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create a user for the container&lt;/span&gt;
&lt;span class="na"&gt;INFO    - CIS-DI-0005&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Enable Content trust for Docker&lt;/span&gt;
        &lt;span class="s"&gt;* export DOCKER_CONTENT_TRUST=1 before docker pull/build&lt;/span&gt;
&lt;span class="na"&gt;IGNORE  - CIS-DI-0006&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Add HEALTHCHECK instruction to the container image&lt;/span&gt;
&lt;span class="na"&gt;PASS    - CIS-DI-0007&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Do not use update instructions alone in the Dockerfile&lt;/span&gt;
&lt;span class="na"&gt;INFO    - CIS-DI-0008&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Remove setuid and setgid permissions in the images&lt;/span&gt;
        &lt;span class="s"&gt;* Found setuid file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;usr/lib/openssh/ssh-keysign urwxr-xr-x&lt;/span&gt;
&lt;span class="na"&gt;IGNORE  - CIS-DI-0009&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Use COPY instead of ADD in Dockerfile&lt;/span&gt;
&lt;span class="na"&gt;FATAL   - CIS-DI-0010&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Do not store secrets in ENVIRONMENT variables&lt;/span&gt;
        &lt;span class="s"&gt;* Suspicious ENV key found&lt;/span&gt; &lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;MYSQL_PASSWD&lt;/span&gt;
&lt;span class="na"&gt;FATAL   - CIS-DI-0010&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Do not store secret files&lt;/span&gt;
        &lt;span class="s"&gt;* Suspicious filename found&lt;/span&gt; &lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app/credentials.json&lt;/span&gt;
&lt;span class="na"&gt;PASS    - DKL-DI-0001&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Avoid sudo command&lt;/span&gt;
&lt;span class="na"&gt;FATAL   - DKL-DI-0002&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Avoid sensitive directory mounting&lt;/span&gt;
        &lt;span class="s"&gt;* Avoid mounting sensitive dirs&lt;/span&gt; &lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/usr&lt;/span&gt;
&lt;span class="na"&gt;PASS    - DKL-DI-0003&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Avoid apt-get/apk/dist-upgrade&lt;/span&gt;
&lt;span class="na"&gt;PASS    - DKL-DI-0004&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Use apk add with --no-cache&lt;/span&gt;
&lt;span class="na"&gt;FATAL   - DKL-DI-0005&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Clear apt-get caches&lt;/span&gt;
        &lt;span class="s"&gt;* Use 'rm -rf /var/lib/apt/lists' after 'apt-get install'&lt;/span&gt; &lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/bin/sh -c apt-get update &amp;amp;&amp;amp; apt-get install -y git&lt;/span&gt;
&lt;span class="na"&gt;PASS    - DKL-DI-0006&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Avoid latest tag&lt;/span&gt;
&lt;span class="na"&gt;FATAL   - DKL-LI-0001&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Avoid empty password&lt;/span&gt;
        &lt;span class="s"&gt;* No password user found! username&lt;/span&gt; &lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nopasswd&lt;/span&gt;
&lt;span class="na"&gt;PASS    - DKL-LI-0002&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Be unique UID&lt;/span&gt;
&lt;span class="na"&gt;PASS    - DKL-LI-0002&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Be unique GROUP&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  Closing
&lt;/h1&gt;

&lt;p&gt;Dockle is &lt;strong&gt;NOT&lt;/strong&gt; a Dockerfile Linter, but a Docker Image Linter.&lt;/p&gt;

&lt;p&gt;Dockle can check deeply. (file permissions, credential files...) So, Dockle is able to check important rules than others, especially for security.&lt;/p&gt;

&lt;p&gt;And Dockle is able to analyze an image created by stdin, too. You could use it in many places.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build -&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
FROM busybox
RUN echo "hello world"
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;I hope you &lt;a href="https://github.com/goodwithtech/dockle"&gt;like it&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Thanks!!&lt;/p&gt;

</description>
      <category>docker</category>
      <category>security</category>
      <category>development</category>
    </item>
    <item>
      <title>How to keep secure your Docker Image</title>
      <dc:creator>Tomoya Amachi</dc:creator>
      <pubDate>Fri, 14 Jun 2019 15:17:09 +0000</pubDate>
      <link>https://dev.to/tomoyamachi/how-to-keep-secure-your-docker-image-2hj2</link>
      <guid>https://dev.to/tomoyamachi/how-to-keep-secure-your-docker-image-2hj2</guid>
      <description>&lt;h1&gt;
  
  
  Overviews
&lt;/h1&gt;

&lt;p&gt;Containers are one of the best tools in recent years.&lt;br&gt;
But it hasn't been established for DevSecOps for containers. Many organizations are unable to keep secure containers' ecosystem.&lt;/p&gt;

&lt;p&gt;This article aims to what is the security best practices Docker Images.&lt;/p&gt;

&lt;p&gt;Do you know &lt;a href="https://github.com/coreos/clair" rel="noopener noreferrer"&gt;Clair&lt;/a&gt; and &lt;a href="https://github.com/docker/docker-bench-security" rel="noopener noreferrer"&gt;Docker Bench for Security&lt;/a&gt;? but It's insufficient.&lt;/p&gt;

&lt;h1&gt;
  
  
  TL;DL
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CIS Benchmarks published Docker security checkpoints&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check your images by Dockle and Trivy&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Easy to check in CI before docker push&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  CIS Benchmarks
&lt;/h1&gt;

&lt;p&gt;One of the best security best practice provided by The Center for Internet Security(CIS).&lt;br&gt;
Their &lt;code&gt;Container Images and Build File&lt;/code&gt; has 11 checkpoints.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a user for the container &lt;/li&gt;
&lt;li&gt;Use trusted base images for containers&lt;/li&gt;
&lt;li&gt;Do not install unnecessary packages in the container&lt;/li&gt;
&lt;li&gt;Scan and rebuild the images to include security patches&lt;/li&gt;
&lt;li&gt;Enable Content trust for Docker&lt;/li&gt;
&lt;li&gt;Add HEALTHCHECK instruction to the container image&lt;/li&gt;
&lt;li&gt;Do not use update instructions alone in the Dockerfile&lt;/li&gt;
&lt;li&gt;Remove setuid and setgid permissions in the images&lt;/li&gt;
&lt;li&gt;Use COPY instead of ADD in Dockerfile&lt;/li&gt;
&lt;li&gt;Do not store secrets in Dockerfiles&lt;/li&gt;
&lt;li&gt;Install verified packages only&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Clair only supports &lt;code&gt;Scan and rebuild the images to include security patches&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is &lt;code&gt;Dockle&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;Dockle&lt;/code&gt; is &lt;code&gt;Simple Security Auditing and helping build the Best Docker Image&lt;/code&gt; tool.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://github.com/goodwithtech/dockle" rel="noopener noreferrer"&gt;Dockle&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://github.com/docker/docker-bench-security" rel="noopener noreferrer"&gt;Docker Bench for Security&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://github.com/coreos/clair" rel="noopener noreferrer"&gt;Clair&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://github.com/knqyf263/trivy" rel="noopener noreferrer"&gt;Trivy&lt;/a&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1.  Create a user for the container&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.  Use trusted base images for containers&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;- &lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.  Do not install unnecessary packages in the container&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;- &lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.  Scan and rebuild the images to include security patches&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.  Enable Content trust for Docker&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;- &lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6.  Add HEALTHCHECK instruction to the container image&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;- &lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7.  Do not use update instructions alone in the Dockerfile&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8.  Remove setuid and setgid permissions in the images&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;- &lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9.  Use COPY instead of ADD in Dockerfile&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10. Do not store secrets in Dockerfiles&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;- &lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11. Install verified packages only&lt;/td&gt;
&lt;td&gt;- &lt;/td&gt;
&lt;td&gt; -&lt;/td&gt;
&lt;td&gt;- &lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;and &lt;code&gt;Dockle&lt;/code&gt; can detect &lt;a href="https://blog.aquasec.com/cve-2019-5021-alpine-docker-image-vulnerability" rel="noopener noreferrer"&gt;CVE-2019-5021&lt;/a&gt; and some other securityholes.&lt;/p&gt;

&lt;h1&gt;
  
  
  Use Dockle
&lt;/h1&gt;

&lt;p&gt;You can start easy!&lt;/p&gt;

&lt;h2&gt;
  
  
  Homebrew (&lt;a href="https://brew.sh/" rel="noopener noreferrer"&gt;Mac&lt;/a&gt; / &lt;a href="https://docs.brew.sh/Homebrew-on-Linux" rel="noopener noreferrer"&gt;Linux&lt;/a&gt;)
&lt;/h2&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DOCKER_CONTENT_TRUST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;span class="nv"&gt;$ &lt;/span&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; test-image:v1 &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;goodwithtech/dockle/dockle
&lt;span class="nv"&gt;$ &lt;/span&gt;dockle test-image:v1


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Linux
&lt;/h2&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DOCKER_CONTENT_TRUST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;span class="nv"&gt;$ &lt;/span&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; test-image:v1 &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nv"&gt;$ VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;
 curl &lt;span class="nt"&gt;--silent&lt;/span&gt; &lt;span class="s2"&gt;"https://api.github.com/repos/goodwithtech/dockle/releases/latest"&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;'"tag_name":'&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'s/.*"v([^"]+)".*/\1/'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; dockle.tar.gz https://github.com/goodwithtech/dockle/releases/download/v&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/dockle_&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;_Linux-64bit.tar.gz
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;tar &lt;/span&gt;zxvf dockle.tar.gz
&lt;span class="nv"&gt;$ &lt;/span&gt;./dockle test-image:v1


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Windows
&lt;/h2&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DOCKER_CONTENT_TRUST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;span class="nv"&gt;$ &lt;/span&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; test-image:v1 &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nv"&gt;$ VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;
 curl &lt;span class="nt"&gt;--silent&lt;/span&gt; &lt;span class="s2"&gt;"https://api.github.com/repos/goodwithtech/dockle/releases/latest"&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;'"tag_name":'&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'s/.*"v([^"]+)".*/\1/'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; dockle.zip https://github.com/goodwithtech/dockle/releases/download/v&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/dockle_&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;_Windows-64bit.zip
&lt;span class="nv"&gt;$ &lt;/span&gt;unzip dockle.zip &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm &lt;/span&gt;dockle.zip
&lt;span class="nv"&gt;$ &lt;/span&gt;./dockle.exe test-image:v1


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;You can check installation &lt;a href="https://github.com/goodwithtech/dockle#installation" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Run Result is here.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fta15xwyttwh1uv3n5ync.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fta15xwyttwh1uv3n5ync.png" alt="passed"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fta15xwyttwh1uv3n5ync.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fta15xwyttwh1uv3n5ync.png" alt="failed"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Check in CI
&lt;/h1&gt;

&lt;p&gt;You can use &lt;a href="https://github.com/knqyf263/trivy" rel="noopener noreferrer"&gt;Trivy&lt;/a&gt; instead of &lt;a href="https://github.com/coreos/clair" rel="noopener noreferrer"&gt;Clair&lt;/a&gt;.&lt;br&gt;
Trivy is easy to start and supports library packages and better accuracy than Clair.&lt;/p&gt;

&lt;h2&gt;
  
  
  CircleCI
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;

&lt;p&gt;&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;br&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;br&gt;
    &lt;span class="na"&gt;docker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;br&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker:18.09-git&lt;/span&gt;&lt;br&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;br&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;checkout&lt;/span&gt;&lt;br&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;setup_remote_docker&lt;/span&gt;&lt;br&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;restore_cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;br&gt;
          &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;vulnerability-db&lt;/span&gt;&lt;br&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;br&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build image&lt;/span&gt;&lt;br&gt;
          &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker build -t ci-test:${CIRCLE_SHA1} .&lt;/span&gt;&lt;br&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;br&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install dockle&lt;/span&gt;&lt;br&gt;
          &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;&lt;br&gt;
            &lt;span class="s"&gt;apk add --update curl&lt;/span&gt;&lt;br&gt;
            &lt;span class="s"&gt;VERSION=$(&lt;/span&gt;&lt;br&gt;
                &lt;span class="s"&gt;curl --silent "&lt;a href="https://api.github.com/repos/goodwithtech/dockle/releases/latest" rel="noopener noreferrer"&gt;https://api.github.com/repos/goodwithtech/dockle/releases/latest&lt;/a&gt;" | &amp;lt;/span&amp;gt;&lt;br&gt;
                &lt;span class="s"&gt;grep '"tag_name":' | &amp;lt;/span&amp;gt;&lt;br&gt;
                &lt;span class="s"&gt;sed -E 's/.&lt;em&gt;"v([^"]+)".&lt;/em&gt;/\1/'&lt;/span&gt;&lt;br&gt;
            &lt;span class="s"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        &amp;lt;span class="s"&amp;gt;wget https://github.com/goodwithtech/dockle/releases/download/v${VERSION}/dockle_${VERSION}_Linux-64bit.tar.gz&amp;lt;/span&amp;gt;
        &amp;lt;span class="s"&amp;gt;tar zxvf dockle_${VERSION}_Linux-64bit.tar.gz&amp;lt;/span&amp;gt;
        &amp;lt;span class="s"&amp;gt;mv dockle /usr/local/bin&amp;lt;/span&amp;gt;
  &amp;lt;span class="pi"&amp;gt;-&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;run&amp;lt;/span&amp;gt;&amp;lt;span class="pi"&amp;gt;:&amp;lt;/span&amp;gt;
      &amp;lt;span class="na"&amp;gt;name&amp;lt;/span&amp;gt;&amp;lt;span class="pi"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="s"&amp;gt;Scan the local image with dockle&amp;lt;/span&amp;gt;
      &amp;lt;span class="na"&amp;gt;command&amp;lt;/span&amp;gt;&amp;lt;span class="pi"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="s"&amp;gt;dockle --exit-code 1 ci-test:${CIRCLE_SHA1}&amp;lt;/span&amp;gt;          

  &amp;lt;span class="pi"&amp;gt;-&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;run&amp;lt;/span&amp;gt;&amp;lt;span class="pi"&amp;gt;:&amp;lt;/span&amp;gt;
      &amp;lt;span class="na"&amp;gt;name&amp;lt;/span&amp;gt;&amp;lt;span class="pi"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="s"&amp;gt;Install trivy&amp;lt;/span&amp;gt;
      &amp;lt;span class="na"&amp;gt;command&amp;lt;/span&amp;gt;&amp;lt;span class="pi"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="pi"&amp;gt;|&amp;lt;/span&amp;gt;
        &amp;lt;span class="s"&amp;gt;apk add --update curl&amp;lt;/span&amp;gt;
        &amp;lt;span class="s"&amp;gt;VERSION=$(&amp;lt;/span&amp;gt;
            &amp;lt;span class="s"&amp;gt;curl --silent "https://api.github.com/repos/knqyf263/trivy/releases/latest" | \&amp;lt;/span&amp;gt;
            &amp;lt;span class="s"&amp;gt;grep '"tag_name":' | \&amp;lt;/span&amp;gt;
            &amp;lt;span class="s"&amp;gt;sed -E 's/.*"v([^"]+)".*/\1/'&amp;lt;/span&amp;gt;
        &amp;lt;span class="s"&amp;gt;)&amp;lt;/span&amp;gt;
        &amp;lt;span class="s"&amp;gt;wget https://github.com/knqyf263/trivy/releases/download/v${VERSION}/trivy_${VERSION}_Linux-64bit.tar.gz&amp;lt;/span&amp;gt;
        &amp;lt;span class="s"&amp;gt;tar zxvf trivy_${VERSION}_Linux-64bit.tar.gz&amp;lt;/span&amp;gt;
        &amp;lt;span class="s"&amp;gt;mv trivy /usr/local/bin&amp;lt;/span&amp;gt;
  &amp;lt;span class="pi"&amp;gt;-&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;run&amp;lt;/span&amp;gt;&amp;lt;span class="pi"&amp;gt;:&amp;lt;/span&amp;gt;
      &amp;lt;span class="na"&amp;gt;name&amp;lt;/span&amp;gt;&amp;lt;span class="pi"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="s"&amp;gt;Scan the local image with trivy&amp;lt;/span&amp;gt;
      &amp;lt;span class="na"&amp;gt;command&amp;lt;/span&amp;gt;&amp;lt;span class="pi"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="s"&amp;gt;trivy --exit-code 1 --quiet --auto-refresh trivy-ci-test:${CIRCLE_SHA1}&amp;lt;/span&amp;gt;
  &amp;lt;span class="pi"&amp;gt;-&amp;lt;/span&amp;gt; &amp;lt;span class="na"&amp;gt;save_cache&amp;lt;/span&amp;gt;&amp;lt;span class="pi"&amp;gt;:&amp;lt;/span&amp;gt;
      &amp;lt;span class="na"&amp;gt;key&amp;lt;/span&amp;gt;&amp;lt;span class="pi"&amp;gt;:&amp;lt;/span&amp;gt; &amp;lt;span class="s"&amp;gt;vulnerability-db&amp;lt;/span&amp;gt;
      &amp;lt;span class="na"&amp;gt;paths&amp;lt;/span&amp;gt;&amp;lt;span class="pi"&amp;gt;:&amp;lt;/span&amp;gt;
        &amp;lt;span class="pi"&amp;gt;-&amp;lt;/span&amp;gt; &amp;lt;span class="s"&amp;gt;$HOME/.cache/trivy&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;span class="na"&gt;workflows&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;br&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;br&gt;
  &lt;span class="na"&gt;release&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;br&gt;
    &lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;br&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;build&lt;/span&gt;&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  TravisCI&lt;br&gt;
&lt;/h2&gt;
&lt;br&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;

&lt;p&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;br&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;br&gt;
  &lt;span class="na"&gt;global&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;br&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;COMMIT=${TRAVIS_COMMIT::8}&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="na"&gt;before_install&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;br&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker build -t ci-test:${COMMIT} .&lt;/span&gt;&lt;br&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;export DOCKLE_VERSION=$(curl --silent "&lt;a href="https://api.github.com/repos/goodwithtech/dockle/releases/latest" rel="noopener noreferrer"&gt;https://api.github.com/repos/goodwithtech/dockle/releases/latest&lt;/a&gt;" | grep '"tag_name":' | sed -E 's/.&lt;em&gt;"v([^"]+)".&lt;/em&gt;/\1/')&lt;/span&gt;&lt;br&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;wget &lt;a href="https://github.com/goodwithtech/dockle/releases/download/v$%7BDOCKLE_VERSION%7D/dockle_$%7BDOCKLE_VERSION%7D_Linux-64bit.tar.gz" rel="noopener noreferrer"&gt;https://github.com/goodwithtech/dockle/releases/download/v${DOCKLE_VERSION}/dockle_${DOCKLE_VERSION}_Linux-64bit.tar.gz&lt;/a&gt;&lt;/span&gt;&lt;br&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;tar zxvf dockle_${DOCKLE_VERSION}&lt;em&gt;Linux-64bit.tar.gz&lt;/em&gt;&lt;/span&gt;&lt;br&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;export TRIVY_VERSION=$(curl --silent "&lt;a href="https://api.github.com/repos/knqyf263/trivy/releases/latest" rel="noopener noreferrer"&gt;https://api.github.com/repos/knqyf263/trivy/releases/latest&lt;/a&gt;" | grep '"tag_name":' | sed -E 's/.&lt;em&gt;"v([^"]+)".&lt;/em&gt;/\1/')&lt;/span&gt;&lt;br&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;wget &lt;a href="https://github.com/knqyf263/trivy/releases/download/v$%7BTRIVY_VERSION%7D/trivy" rel="noopener noreferrer"&gt;https://github.com/knqyf263/trivy/releases/download/v${TRIVY_VERSION}/trivy&lt;/a&gt;${TRIVY_VERSION}&lt;em&gt;Linux-64bit.tar.gz&lt;/em&gt;&lt;/span&gt;&lt;br&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;tar zxvf trivy${TRIVY_VERSION}_Linux-64bit.tar.gz&lt;/span&gt;&lt;br&gt;
&lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;br&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./dockle --exit-code 1 ci-test:${COMMIT}&lt;/span&gt;&lt;br&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./trivy --exit-code 1 --quiet --auto-refresh ci-test:${COMMIT}&lt;/span&gt;&lt;br&gt;
&lt;span class="na"&gt;cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;br&gt;
  &lt;span class="na"&gt;directories&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;&lt;br&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;$HOME/.cache/trivy&lt;/span&gt;&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Conclusion&lt;br&gt;
&lt;/h1&gt;

&lt;p&gt;You can check your Docker Container Images to use &lt;code&gt;Dockle&lt;/code&gt; and &lt;code&gt;Trivy&lt;/code&gt;!&lt;br&gt;
These are OSS tools.&lt;/p&gt;

&lt;p&gt;If you feel like I missed something, got some details wrong, or just want to say hi, please feel free to leave a comment below or reach out to me on &lt;a href="https://github.com/tomoyamachi" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; or &lt;a href="https://twitter.com/tomoyamachi" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>security</category>
      <category>container</category>
    </item>
  </channel>
</rss>
