DockerfileもLintしたいなぁという欲がずっとあって調べてみたらこんなのを見つけた。
Haskellで書かれたDockerfileのLintツールのようです。
インストール
Macならhomebrewでできます。
$ brew install hadolint
Lintしてみる
サンプルとして提示されていたDockerfileを使ってみます。内容は以下のようなDockerfile。エラー吐きそうなのが一目瞭然ですね。
FROM debian
RUN export node_version="0.10" \
&& apt-get update && apt-get -y install nodejs="$node_verion"
COPY package.json usr/src/app
RUN cd /usr/src/app \
&& npm install node-static
EXPOSE 80000
CMD ["npm", "start"
使い方は簡単で、Dockerfileのパスを渡すだけ。
$ hadolint Dockerfile
DL4000 Specify a maintainer of the Dockerfile
L1 DL3006 Always tag the version of an image explicitly.
L2 SC2154 node_verion is referenced but not assigned (did you mean 'node_version'?).
L2 DL3009 Delete the apt-get lists after installing something
L2 DL3015 Avoid additional packages by specifying `--no-install-recommends`
L5 DL3003 Use WORKDIR to switch to a directory
L8 DL3011 Valid UNIX ports range from 0 to 65535
こんなのがずらずらと出ました。一番左側が行番号で、次の列がエラーコード、その次が内容です。エラーコードについてはREADMEに一覧が記載されているので参照してくださいって感じですが、まあ標準出力の結果だけでも内容はわかりますね。
ちょっとめぼしいところを見ていきましょうか。
DL3009 Delete the apt-get lists after installing something
これはパッケージのインストール後に、インストールで発生した産業廃棄物を撤去しろということみたいですね。
たとえば、このようなプロセスであれば、
RUN apt-get update && apt-get install -y python
以下のようにapt-get cleanしたり、listsを削除することを推奨してくれています。Dockerイメージのサイズの観点でも検査してくれていることがわかります。
RUN apt-get update && apt-get install -y python \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
DL3015の**–no-install-recommends**を指定せよというやつも、サイズ対策ですね。
Alpine LinuxでもOK
Alpine LinuxのDockerfileでも問題なく動きます。ただ、APK ADD –no-cacheをつけなさい的なのは出なかったので、Alpineでサイズ観点でのチェックには対応されてないっぽいですね。
あと最近entrykitがブームですが、ウチのプロジェクトでentrykitを使ってるDockerfileで試しても問題なく検査してくれました。
Web版(動かない)
最初Web版を見つけたんですが、こちらはCross Origin制約エラーが出てうまく動きません。作業中かな?
http://hadolint.lukasmartinelli.ch/
まとめ
結構良さ気なのでCircleCIでのdocker build時に組み込んでみますわ。