web-dev-qa-db-ja.com

Dockerfileをリントする方法はありますか?

たとえば、Dockerfileが誤って記述されている場合:

CMD ["service", "--config", "/etc/service.conf](引用符がありません)

構築する前にそのような間違いを検出するために糸くずを出す方法はありますか?

16
eloone

試してみてください:

RUNADDENV、および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

14
Devy

RedHatサブスクリプションをお持ちの場合は、「LinterforDockerfile」アプリケーションに直接アクセスできます https://access.redhat.com/labs/linterfordockerfile/ ;アプリケーションに関する情報は次の場所にあります https://access.redhat.com/labsinfo/linterfordockerfile

このNode.jsアプリケーションは、ローカルで実行する場合はGitHub https://github.com/redhataccess/dockerfile_lint でも入手できます。

2
Yves Martin

VS Codeの拡張機能として dockerfile-validator を作成しました。これは、前の回答で述べた dockerfile-lint を使用します。デフォルトではdockerfile-lintのデフォルトルールを使用しますが、VSコードのユーザー設定(dockerfile-validator.rulefile.path)では、独自のコーディング標準を使用してカスタムルールファイルへのパスを指定できます。

1
Miguel Marques

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>

また、タグ付けのために画像を糸くずにすることができます。

0
ekostadinov