Hadolintとは
Hadolint はDockerfileのLintツールで、 Dockerfileのベストプラクティス に 沿っているかをチェックする。
Hadolintの使い方
インストール
Macの場合はHomebrewでインストールできる。
$ brew install hadolint
他のOSの場合は Releases · hadolint/hadolint より最新版をダウンロードしてインストールする。
例えば以下のようにダウンロードして/usr/local/bin/に配置する。
$ curl -L https://github.com/hadolint/hadolint/releases/download/v2.12.0/hadolint-Linux-x86_64 -o hadolint
$ mv hadolint /usr/local/bin/
$ chmod +x /usr/local/bin/hadolint
実行
HadolintはhadolintコマンドにDockerfileを渡して実行する。
$ hadolint Dockerfile
実行結果
問題が検出される場合
例えばDockefileが以下のような場合。
FROM public.ecr.aws/amazonlinux/amazonlinux
ADD docker-compose.yml /docker-compose.yml
実行すると以下のように出力される。
$ hadolint Dockerfile
Dockerfile:1 DL3006 warning: Always tag the version of an image explicitly
Dockerfile:4 DL3020 error: Use COPY instead of ADD for files and folders
$ echo $?
1
問題が検出された場合は終了ステータスコードが1となる。
問題ない場合
問題が検出されない場合は以下のように終了ステータスコードが0となる。
例えば以下のようなDockerfileの場合
FROM public.ecr.aws/amazonlinux/amazonlinux:2023.2.20231011.0
COPY docker-compose.yml /docker-compose.yml
以下のように終了ステータスコードが0となる。
$ hadolint Dockerfile
$ echo $?
0
ルール
Hadolintで検出されるルールはRules
に一覧がある。
深刻度(Severity)
Hadolintで検出されるルールには以下の深刻度(Severity)が設定されている。
- Error
- Warning
- Info
- Style
- Ignore
どのレベルまでを許容とするかはチームやプロジェクトできめておくとよい。
失敗とみなす(終了ステータスコード1とする)深刻度を指定する(–failure-threshold, -t)
$ hadolint Dockerfile
Dockerfile:1 DL3006 warning: Always tag the version of an image explicitly
$ echo $?
1
デフォルトではinfo以上が失敗とみなされ、終了ステータスコードが1となる。
--failure-thresholdオプション(-tオプション)で失敗とみなす深刻度を指定できる。
$ hadolint Dockerfile -t error
Dockerfile:1 DL3006 warning: Always tag the version of an image explicitly
$ echo $?
0
-t errorを指定するとerror以上が失敗とみなされ、上記の結果ではwarningしかないので終了ステータスコードが0となる。
検出対象からの除外
コマンドライン引数で除外する(–ignore)
--ignoreオプションで検出対象から除外できる。
$ hadolint Dockerfile
Dockerfile:1 DL3006 warning: Always tag the version of an image explicitly
Dockerfile:4 DL3020 error: Use COPY instead of ADD for files and folders
$ hadolint --ignore DL3006 Dockerfile
Dockerfile:4 DL3020 error: Use COPY instead of ADD for files and folders
設定ファイルで除外する(.hadolint.yaml)
カレントディレクトリに以下のように.hadolint.yamlを作成する。
ignored:
- DL3006
上記ファイルを設置したディレクトリでhadolintを実行するとDL3006が検出されない。
$ hadolint Dockerfile
Dockerfile:4 DL3020 error: Use COPY instead of ADD for files and folders
.hadolint.yamlは除外設定のほかにもさまざまな設定ができる。詳しくは
Configure
を参照。
GitHub Actionsでの実行
GitHub ActionsでHadolintを実行するには hadolint/hadolint-action を利用する。
以下のように.github/workflows/hadolint.ymlを作成する。
name: hadolint
on:
pull_request:
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
steps:
# リポジトリをチェックアウト
- uses: actions/checkout@v4
# Hadolintを実行
- uses: hadolint/hadolint-action@v3.1.0
with:
dockerfile: ./Dockerfile
failure-threshold: warning
Gitリポジトリをチェックアウトしたうえで、Dockerfileの場所をdockerfileに指定している。
failure-thresholdで失敗とみなす深刻度を指定している。failure-thresholdのデフォルト値はinfo。
AWS CodeBuildでの実行
AWS CodeBuildで利用するには以下のようにbuildspec.ymlを作成する。
HadolintはDockerfileのみのチェックなので、docker buildでDockerイメージをビルドする前に以下の手順で実行すれば良い。
- Hadolintのダウンロード
- Hadolintの実行
version: 0.2
phases:
install:
commands:
...
# Hadolintのダウンロード
- VERSION=$(curl --silent "https://api.github.com/repos/hadolint/hadolint/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') && curl --silent -L https://github.com/hadolint/hadolint/releases/download/v${VERSION}/hadolint-Linux-x86_64 -o hadolint
- chmod +x hadolint
...
build:
commands:
...
# Hadolintの実行
- ./hadolint Dockerfile -t warning
...
- docker build ...
...
