めもちょー

メモ帳代わりに使っています。

hadolint (Haskell Docker Linter) でdockerfileのリントを行う

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/*

tech-blog.cloud-config.jp

DL3042

pipする際にキャッシュしてしまうとこのエラーが出ます。
no-cache-dirオプションをつけると出なくなります。

RUN pip3 install --no-cache-dir MySQL_python

nykergoto.hatenablog.jp

DL3013

pipにversionをつけろとのことのようです。

DL3059

順に実行するRUNコマンドを&で繋げろとのことのようです。

DL3025

ENTRYPOINT, CMD は文字列のリストで指定しろとのことのようです。

参考
c-a-p-engineer.github.io
kakakakakku.hatenablog.com