hadolintを試してみたのでメモを残します。
ローカルで実行
バイナリで実行する
/usr/local/bin/ にcurlでバイナリを落とし権限を変更します。
$ sudo curl -L https://github.com/hadolint/hadolint/releases/download/v2.8.0/hadolint-Linux-x86_64 -o /usr/local/bin/hadolint $ chmod 755 /usr/local/bin/hadolint $ hadolint Dockerfile
Dockerで実行する
$ docker run --rm -i hadolint/hadolint < Dockerfile
GitHub Actions で実行
.github/workflows/run.yml に下記のような記述を行います。
jobs: docker_linter: name: hadolint runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 - uses: hadolint/hadolint-action@v2.0.0 with: dockerfile: ./Dockerfile ignore: DL3001,DL3002,DL3003
オプションは下記を参考に with以下の階層に書く
github.com
自分が書いたDockerfileで試す
Error: ./Dockerfile:3 DL3008 warning: Pin versions in apt get install. Instead of `apt-get install <package>` use `apt-get install <package>=<version>` Error: ./Dockerfile:3 DL3015 info: Avoid additional packages by specifying `--no-install-recommends` Error: ./Dockerfile:8 DL3042 warning: Avoid use of cache directory with pip. Use `pip install --no-cache-dir <package>` Error: ./Dockerfile:8 DL3013 warning: Pin versions in pip. Instead of `pip install <package>` use `pip install <package>==<version>` or `pip install --requirement <requirements file>` Error: ./Dockerfile:8 DL3059 info: Multiple consecutive `RUN` instructions. Consider consolidation. Error: ./Dockerfile:13 DL3025 warning: Use arguments JSON notation for CMD and ENTRYPOINT arguments
DL3008
apt-get でversion を指定していない、versionを固定していないと再現性が担保できないとのことです。
DL3015
実際は下記のように --no-install-recommends オプションを使って必要最小限のインストールを一度に複数行うのがいいでしょう。
また、apt updateとapt installの行をまとめることで古いパッケージ情報のキャッシュ利用を避けることができます。
最後に不要なパッケージマネージャーのキャッシュを削除して容量を削減します。
これらのコマンドをまとめることでレイヤ数を必要最小限にし、さらに容量を削減できます。RUN apt-get update \
&& apt-get install -y --no-install-recommends \
cowsay \
nyancat \
&& apt-get -y clean \
&& rm -rf /var/lib/apt/lists/*
DL3042
pipする際にキャッシュしてしまうとこのエラーが出ます。
no-cache-dirオプションをつけると出なくなります。
RUN pip3 install --no-cache-dir MySQL_python
DL3013
pipにversionをつけろとのことのようです。
DL3059
順に実行するRUNコマンドを&で繋げろとのことのようです。
DL3025
ENTRYPOINT, CMD は文字列のリストで指定しろとのことのようです。