たとえば、Dockerfileが誤って記述されている場合:
CMD ["service", "--config", "/etc/service.conf]
(引用符がありません)
構築する前にそのような間違いを検出するために糸くずを出す方法はありますか?
試してみてください:
hadolint
はDockerfileをASTに解析し、 ベストプラクティスのDockerイメージルール に基づいてチェックと検証を実行します。また、 ShellcheckRUN
コマンドでBashコードをリントします。RUN
、ADD
、ENV
、およびCMD
を使用して単純なDockerファイルに対して簡単なテストを実行しました。 dockerlinter
は、同じルール違反をグループ化することについて賢明でしたが、おそらくBashコードを静的に分析するためのhadolinter
がないため、Shellcheck
ほど徹底的に検査することができませんでした。 。
dockerlinter
は糸くずの出ない範囲では不十分ですが、インストールははるかに簡単のようです。 npm install -g dockerlinter
でもかまいませんが、hadolinter
のコンパイルには、コンパイルに永遠にかかるHaskellコンパイラとビルド環境が必要です。
$ hadolint ./api/Dockerfile
L9 SC2046 Quote this to prevent Word splitting.
L11 SC2046 Quote this to prevent Word splitting.
L8 DL3020 Use COPY instead of ADD for files and folders
L10 DL3020 Use COPY instead of ADD for files and folders
L13 DL3020 Use COPY instead of ADD for files and folders
L18 DL3020 Use COPY instead of ADD for files and folders
L21 DL3020 Use COPY instead of ADD for files and folders
L6 DL3008 Pin versions in apt get install. Instead of `apt-get install <package>` use `apt-get install <package>=<version>`
L6 DL3009 Delete the apt-get lists after installing something
L6 DL3015 Avoid additional packages by specifying `--no-install-recommends`
$ dockerlint ./api/Dockerfile
WARN: ADD instruction used instead of COPY on line 8, 10, 13, 18, 21
ERROR: ./api/Dockerfile failed.
2018年に更新。 hadolint
には公式のDockerリポジトリがあるため、実行可能ファイルをすばやく取得できます。
id=$(docker create hadolint/hadolint:latest)
docker cp "$id":/bin/hadolint .
docker rm "$id"
これは静的にコンパイルされた実行可能ファイル(ldd hadolint
による)であるため、インストールされているライブラリに関係なく実行する必要があります。実行可能ファイルの構築方法に関するリファレンス: https://github.com/hadolint/hadolint/blob/master/docker/Dockerfile 。
RedHatサブスクリプションをお持ちの場合は、「LinterforDockerfile」アプリケーションに直接アクセスできます https://access.redhat.com/labs/linterfordockerfile/ ;アプリケーションに関する情報は次の場所にあります https://access.redhat.com/labsinfo/linterfordockerfile
このNode.jsアプリケーションは、ローカルで実行する場合はGitHub https://github.com/redhataccess/dockerfile_lint でも入手できます。
VS Codeの拡張機能として dockerfile-validator を作成しました。これは、前の回答で述べた dockerfile-lint を使用します。デフォルトではdockerfile-lintのデフォルトルールを使用しますが、VSコードのユーザー設定(dockerfile-validator.rulefile.path)では、独自のコーディング標準を使用してカスタムルールファイルへのパスを指定できます。
CIパイプラインnpmの dockerfile_lint で非常にうまく使用しています。ルールを追加または拡張できます。 package.json
を使用すると、ジョブごとに異なる構成を作成できます。両方あります
DockerCLI
docker run -it --rm --privileged -v `pwd`:/root/ \
projectatomic/dockerfile-lint \
dockerfile_lint [-f Dockerfile]
docker run -it --rm --privileged -v `pwd`:/root/ \
-v /var/run/docker.sock:/var/run/docker.sock \
projectatomic/dockerfile-lint \
dockerfile_lint image <imageid>
およびAtomicCLIが利用可能
atomic run projectatomic/dockerfile-lint
atomic run projectatomic/dockerfile-lint image <imageid>
また、タグ付けのために画像を糸くずにすることができます。