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イメージをビルドする前に以下の手順で実行すれば良い。

  1. Hadolintのダウンロード
  2. 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 ...
      ...