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 ...
...