dockerfile-pin: Dockerfile / compose / GitHub Actions のイメージを @sha256: で固定する
FROM node:22 のようなタグ指定は、同じタグの中身が差し替えられると知らないうちに別のイメージを使うことになる。azu 作の CLI dockerfile-pin を使うと、Dockerfile の FROM、compose の image:、GitHub Actions のコンテナイメージ参照にダイジェストを自動で付けられ、CI でピン留め漏れも検出できる。
どんなときに使う?
- サプライチェーン攻撃対策として、ベースイメージを不変な参照にしたい
- 既存リポジトリにまとめてダイジェストを入れたい/PR でピン留め漏れを止めたい
手順
bash
# 変更内容を確認(デフォルトは dry-run)
dockerfile-pin run
# 実際に書き込む
dockerfile-pin run --write
# 対象を絞る
dockerfile-pin run -f docker-compose.yml
dockerfile-pin run --glob '**/Dockerfile*'
# 既存のダイジェストを最新に更新
dockerfile-pin run --write --update
# 特定イメージを除外
dockerfile-pin run --ignore-images "mcr.microsoft.com/**"結果は FROM node:22@sha256:<digest> のようにタグ+ダイジェストの形になる。
CI でチェック
bash
dockerfile-pin check # ダイジェストがない/レジストリに存在しないと exit 1
dockerfile-pin check --syntax-only # レジストリに問い合わせない
dockerfile-pin check --format jsonREADME では PR ごとに dockerfile-pin check を走らせる GitHub Actions の例(aqua でインストール)が紹介されている。-f / --glob を省略すると git ls-files から対象ファイルを自動検出する。
注意点
- ダイジェストで固定すると、セキュリティ修正入りの新しいイメージも自動では入らない。Renovate などで定期的に更新 PR を出す運用とセットにする。
- 関連: GitHub Actions の
uses:を SHA 固定する pinact GitHub Actions: pinact で uses: をコミット SHA に固定する