GitHub Actions と hadolint を組み合わせて Dockerfile の静的解析を自動化しよう! - kakakakakku blog を読んで、自身のGHAにも組み込んでみた。
hadolint (Haskell Dockerfile Linter)
hadolintとは、DockerfileをDockerfile Best Practicesに沿って解析してくれるツールだそうな。
詳しくは本家へ↓↓
Created by https://ghlinkcard.com/
さっそくGHAに組み込む
めちゃくちゃ簡単!
以下の感じで brpaz/hadolint-action@master
を使うだけでGitHub ActionsでDockerfileを解析してくれる!
name: Workflow
on: push
jobs:
build:
name: Hadolint
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Hadolint
uses: brpaz/hadolint-action@master
結果
GHAの実行結果として、 Dockerfile:23 DL3006 Always tag the version of an image explicitly
と返ってきた。
その時のDockerfileが以下
| ...
L23 | FROM gcr.io/distroless/base-debian10
| ...
ベースイメージのタグを明示的に付けて〜的なやつの警告です。
対応としては、 base-debian10:latest
とか base-debian10:v1.0.0
とかにするのだが、この distroless
とやらは バージョンタグがなく latest
かハッシュ値しか使えない。さらに、今回の対応で latest
を指定しても、hadolintで別の警告( DL3007 Using latest is prone to errors if the image will ever update. Pin the version explicitly to a release tag
)が出される。
警告(DL3006
)における対応
hadolint公式にHow to useやConfigureという項目があり、起動オプションやyamlファイルで設定できるよ〜と書いたあった
ただ、DL3006
の警告をすべて無視するとDockerfileのマルチステージビルド時に別の箇所(今回で言うL23以外)で同様の警告が出た際も無視され、本来やりたかったベストプラクティスに沿った安全な運用ができなくなってしまう。
悩んでいると同僚にhadolintにはDockerfileに直接警告を無視するコメントを付与できる、Inline ignoresというのがあることを教えてもらった(感謝!
確かに公式を見てみるとちゃんと書いてあった(公式をちゃんと読もうと再認識した
よって、以下のように1行コメント(Inline ignores)を入れて、再度git pushすると無事にGHAが走りhadolintの警告がなくなった。
| ...
L23 | # hadolint ignore=DL3006
L24 | FROM gcr.io/distroless/base-debian10
| ...
まとめ
- hadolintをGHAに簡単に組み込むことができた
- ベストプラクティスに沿った安全なDockerfileを運用できた
- Exh: 公式サイトはちゃんと読もう