はじめに
Dockerfile、サッと書こうと思ったのに、書き始めたら意外と時間かかったりしますよね。
突き詰めるとすごく奥が深いなと思います。
公式のドキュメントでも、Dockerfileのベスト・プラクティスという形で公開してくれていますが、
これを毎回意識するのは大変です。
また、意識できていたとしても、複数人で管理していると、各個人のスキルレベルによって差が出てしまいます。
そんなときにおすすめのツールを見つけたので紹介します。
hadolintというツールです。
Haskell Dockerfile Linter
の略だそうで、Dockerfileの静的解析を行ってくれるlintツールです。
hadolintを使うとこんな利点があります。
- build前にシンタックスエラーなどに気付ける (地味にトライアンドエラーしてると時間食うんですよね...)
- 自然とベストプラクティスに則ったDockerfileが書ける
導入方法
では早速使ってみましょう。
- インストール
- macの場合
brew install hadolint
- linuxの場合
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
- macの場合
- installしたら
hadolint Dockerfile
のようにファイル名を指定するだけ
CI/CDに組み込む場合
GitLab CIの場合
hadolint公式より引用
rulesの箇所のみ追記しています。毎回走らせる必要性は薄いと思うので、Dockerfileの変更時のみという条件を追加しています。
lint_dockerfile:
image: hadolint/hadolint:latest-debian
# image: ghcr.io/hadolint/hadolint:latest-debian
script:
- hadolint Dockerfile
rules:
- changes:
- Dockerfile
GitHub Actionsの場合
同じくhadolint公式より引用
pathsのみ追記しています。
name: Lint Dockerfile
on: push
jobs:
linter:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Lint Dockerfile
uses: hadolint/hadolint-action@master
with:
dockerfile: "Dockerfile"
paths:
- 'Dockerfile'
vscodeで使用する場合
※hadolintのインストールは済ませておく必要があります
下記をvscodeから取得してください。
触ってみる
では試しに下記のrubyのイメージに実行してみます。
FROM ruby:3.2.1
RUN apt-get update -qq && apt-get install -y build-essential nodejs
RUN mkdir /app
WORKDIR /app
ADD Gemfile /app/Gemfile
ADD Gemfile.lock /app/Gemfile.lock
RUN bundle install
ADD . /app
hadolint Dockerfile
を実行すると、下記のように色分けして出力されました!
hadolint wikiがあるので、参照すると理由ともに修正方法を教えてくれます。
↓のような形でwikiが記載されているのでとても見やすいです。
試しに直してみましょう。 ADDをCOPYに変更すると↓errorの文字は消えています!
また、ignoreをコマンドで実行することもできます。
hadolint --ignore DL3008 Dockerfile
warningが消えてますね。
ただ、ignoreを毎回コマンドで打つということは基本的にあまりしないと思うので、ignore用のファイルを作ることができます。
hadolintのオプション
基本的にはhadolintの公式を見てもらうのがいいと思いますが、
よく使いそうなものを説明します。
特定のlintエラーを表示したくない場合
- hadolintコマンド実行時にignoreオプションを指定する
- ex)
hadolint --ignore DL3008 Dockerfile
- ex)
- .hadolint.yamlで記載する
- Dockerfileにインラインコメントで記載する
.hadolint.yamlの例。 以下のようにignoredで一つ一つルールを指定する。
ignored:
- DL3008
Dockerfileにインラインコメントで記載する例。
globalを付けると、ファイル全体で無視。global付けない場合は次の行だけを無視する.
# hadolint global ignore=DL3008
FROM ruby:3.2.1
# hadolint ignore=DL3008
RUN apt-get update -qq && apt-get install -y build-essential nodejs
RUN mkdir /app
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install
COPY . /app
終わりに
以上、hadolintの使い方について説明しました!
lintに慣れてくると、自然とベストプラクティスに沿った書き方ができるようになっていると思います。
理由もwikiに記載してくれているので、合わせて確認すると、なぜこの書き方にしないといけないか?も分かるのでチェックしましょう!
hadolintで、皆さんもDockerfileのベスト・プラクティスを実践していきましょう!
最後までお読みいただきありがとうございました。