Docker

GitHub Actionsで実務的に構築するDocker CI/CDパイプライン

ⓘ本ページはプロモーションが含まれています

お得なお知らせ

スポンサードリンク
1ヶ月で資格+現場入り

インフラエンジニアへの最短ルート

未経験でもAWS・Linux・ネットワーク資格を最短で取り、現場入りまでサポート。SREやクラウドエンジニアの入口。

CODE×CODEスピード転職|無料面談▶ SRE/クラウドのフリーランス案件▶

▶ AWS/GCP/Kubernetesの独学には Kindle Unlimited の技術書読み放題がコスパ最強。


スポンサードリンク

GitHub Actionsでのワークフロー設計と責務分離

CI はビルド・テスト・静的解析・SBOM・脆弱性スキャン・署名までを担い、CD は署名済みの不変イメージを参照してデプロイします。こうすることで再現性と追跡性が確保できます。

イベントとブランチ戦略

トリガーはフィードバック速度とコストのバランスで決めます。PR では軽量な検査、main/tags ではフルパイプラインを回すのが実務的です。

  • pull_request: PR プレビュー、ユニットテスト、軽量ビルド、SBOM 生成。PR クローズでプレビュー環境破棄。
  • push (feature/develop): 開発用タグをレジストリへ push。CI を回して早期検出。
  • push (main) / tags (v..*) / release: 本番向けのフルビルド(マルチアーキ、深いスキャン、署名)、承認フローでデプロイ。
  • workflow_dispatch / schedule: 手動実行や定期スキャン用。

運用上のポイント

運用面は承認・並列制御・タイムアウト設計が重要です。環境ごとの保護設定や concurrency、timeout-minutes を適切に設定してください。

  • Environments を使って承認フローを設定する。
  • concurrency を使って同一ブランチの重複実行を防ぐ。
  • job ごとに timeout-minutes と retry パターンを定義する。

実務的なDockerfileの書き方とテスト実行

ランタイムとビルド依存を分離するマルチステージビルドが基本です。HEALTHCHECK 実装やビルド中のテスト実行、最小限のランタイムイメージ設計を優先してください。

マルチステージとレイヤー設計

変化しにくいレイヤーを上に、変化しやすいソースを下に置きます。テストはビルドステージ内で実行することで最終イメージに devDependencies を残さずにテスト可能です。

上の構成では、docker build --target test でテストステージを実行し、成功すれば docker build --target runtime で最終イメージを作成できます。

HEALTHCHECK:curl をインストールする例

ランタイムに curl を入れる場合は最小限に留め、キャッシュと不要なパッケージを残さないようにします。curl が無いイメージもあるため注意が必要です。

インストールはイメージサイズを増やすので、必要性を評価してください。

HEALTHCHECK:Node スクリプトで実装する例

Node アプリなら小さなスクリプトでヘルスチェックを書く方が軽量です。ランタイムに追加のパッケージを入れずに済みます。

このスクリプトを最終イメージへコピーして HEALTHCHECK で実行します。HEALTHCHECK のコマンドは 0/非0 の返り値で判定されるため、|| exit 1 のような冗長表現は不要です。

テストをビルドステージで実行する方法

テストは最終イメージに devDependencies を残すのではなく、ビルド工程の test ステージで実行してください。GitHub Actions では buildx を使って target: test をビルドさせるとよいです。

例(GitHub Actions のステップ):

このステップで npm test が失敗すればパイプラインが停止します。最終イメージにはテストツールが残りません。

GitHub ActionsでのDockerビルドとキャッシュ設計

buildx と registry/cache、actions/cache を組み合わせると高速かつ安定したビルドが可能です。キャッシュキーの設計と無効化方法をあらかじめ決めて運用できます。

buildx と docker/build-push-action の使い方

buildx はマルチアーキとレイヤーキャッシュを有効にします。Action は将来的な破壊的変更を回避するため、必要に応じてコミット SHA やリリース版(パッチ指定)で固定してください。

注記: @v2 / @v4 などのメジャーバージョンのみ指定すると将来の破壊的変更を取り込む可能性があります。重要な CI に組み込む場合は、定期的にリリースノートを確認し、安定したコミット SHA やリリースタグで固定する運用を検討してください。

actions/cache のキー設計と無効化方法

依存キャッシュにはハッシュを使い、復元キーも用意します。キャッシュ無効化は「バージョン文字列を増やす」か、ファイルハッシュを変えることで行います。

例(node_modules):

設計例:

  • 依存キャッシュキー = OS + lockfile ハッシュ + キャッシュバージョン
  • レイヤーキャッシュ(buildx) = registry の ref を使い、BUILD_CACHErepo:buildcache-v1 のようなバージョンを付与して必要時に v2 へ切り替える

キャッシュの破損時にはキーを更新して強制的に再構築させるフローを用意してください。

レジストリ連携・認証・署名の運用

レジストリへの push/プルはパーミッションと組織ポリシーに影響されます。OIDC を使った短期認証を第一選択とし、PAT はポリシーが許さない場合の代替としてください。

GHCR の注意と権限

ワークフローで GHCR に push する場合、ワークフロー権限と組織ポリシーに注意が必要です。最低限 workflow の permissions に packages: write を設定してください。また、組織が GITHUB_TOKEN によるパッケージ公開を制限している場合は PAT を用意する必要があります。

例(workflow permissions):

組織や Enterprise のポリシーで GITHUB_TOKEN によるパッケージ作成が無効化されている場合は、リポジトリシークレットに PAT(最小スコープで packages:write 等)を用意して docker/login-action に渡す運用が必要です。PAT のスコープは GitHub の公式ドキュメントで最新仕様を確認してください。

AWS ECR OIDC と KMS の前提と設定

AWS に対して OIDC で短期クレデンシャルを使い、KMS を署名キーに使う場合は IAM ロールの trust ポリシーと KMS キーポリシー両方が正しく設定されている必要があります。主な前提と検証手順を示します。

  • OIDC プロバイダー(token.actions.githubusercontent.com)を AWS アカウントに登録する。
  • 最小権限の IAM ロールを作成し、trust ポリシーで GitHub Actions のサブジェクト(repo:OWNER/REPO:ref:refs/heads/main など)を限定する。
  • KMS キーのキーポリシーに IAM ロールを明示的に許可(kms:Sign, kms:GetPublicKey, kms:Verify 等)する。

例(IAM ロールの信頼ポリシー、プレースホルダは置換してください):

例(KMS キーポリシーの該当ステートメント):

検証方法の例:

  • GitHub Actions 上で aws sts get-caller-identity を実行してロールの取得を確認する。
  • aws kms get-public-key --key-id arn:aws:kms:REGION:ACCOUNT_ID:key/KEY_ID が成功するかを確認する。
  • cosign の署名試行(検証用)を実行して KMS にアクセスできるか確認する。

KMS のキーポリシーと IAM ロールの不一致が最も多いトラブル原因なので、テストを用意しておくことを推奨します。

セキュリティ運用と脆弱性対応ワークフロー

SBOM、脆弱性スキャン、署名は検出だけで終わらせず、発見時のエスカレーションやチケット連携までを含めた運用設計が必要です。

SBOM と脆弱性スキャンの自動化

SBOM は syft 等で生成し、Trivy 等でスキャンします。Trivy を使う場合は DB を事前に更新してからスキャンすることで検出精度が上がります。

例(Trivy の実行例):

スキャン結果はアーティファクトとして保存し、担当者へ通知または Issue 作成のトリガーとします。

脆弱性発見時の運用フローとチケット連携

発見時フローの例を決めておきます。自動化できる部分は自動化し、判定が必要な部分は人間のワークフローへつなぎます。

  • 重大(HIGH/CRITICAL): パイプラインを失敗させ、Issue を自動作成してアサインする。
  • 中程度(MEDIUM): 自動で警告、定期レビューで対応。
  • False positive: .trivyignore や例外管理でトラッキングし、False Positive の根拠を Issue に紐づける。

自動 Issue 作成は peter-evans/create-issue-from-file 等のアクションで実現できます。スキャン DB(例: Trivy DB)は定期的に更新し、更新済みデータに基づく再スキャンをスケジュールしてください。

署名の導入と cosign の安全な導入

cosign を導入する場合、バイナリを curl で直接落として /usr/local/bin に置く方法は検証が不足しがちです。以下のいずれかの方法で検証を行ってください。

  • 公式リリースのチェックサム(SHA256)と署名(.sig/GPG)を取得して検証する。署名の公開鍵指紋は公式リポジトリのドキュメントで確認し、鍵のフィンガープリントを事前に照合してください。

例(概念的な手順):

  • 公式のコンテナイメージ(または GitHub Action)を利用する。イメージは digest 固定(@sha256:...)で利用するのが安全です。コンテナ実行時は必要な一時クレデンシャルのみを渡します。

どちらの方法でも「署名/チェックサムを検証する」か「信頼できる配布チャネル(公式 Action / 公式コンテナ)をダイジェスト固定で使う」ことを必須にしてください。

ワークフロー最小テンプレート(動くコピー&ペースト)

ここは動作に必要な最低限のワークフロー例です。実運用ではシークレット名やバージョン固定、組織ポリシーに合わせて調整してください。Action のバージョンは将来の破壊的変更を避けるため、可能な範囲でコミット SHA またはパッチ指定で固定し、定期的にレビューしてください。

上のテンプレートは最小構成です。環境に応じて以下を追加してください。

  • Action のバージョン固定(可能ならコミット SHA)
  • GHCR に push できない場合の PAT(スコープは最小限に)
  • cosign の検証(署名/チェックサム検査)やコンテナイメージの digest 固定

参考ドキュメント(優先度:公式→補助資料)

公式ドキュメントを優先して参照してください。外部記事(Zenn/Qiita 等)は補助資料として扱い、実装前に公式の仕様とリリースノートを必ず確認してください。

  • GitHub Actions: Workflows と Permissions(公式ドキュメント)
    https://docs.github.com/actions

  • GitHub OIDC 設定(公式)
    https://docs.github.com/actions/deployment/security-hardening-your-deployments/configuring-openid-connect

  • Docker + GitHub Actions(公式)
    https://docs.docker.com/ci-cd/github-actions/

  • sigstore / cosign リリースページ(署名・チェックサムを確認する)
    https://github.com/sigstore/cosign/releases

  • Trivy ドキュメント(公式)
    https://aquasecurity.github.io/trivy/latest/

外部記事(補助): Zenn / Qiita 等は参考になりますが、情報の鮮度や実装詳細は公式ドキュメントやリリースノートを優先してください。

まとめ

CI 側でビルド・テスト・SBOM・スキャン・署名を完結させ、CD は署名済みの不変イメージをデプロイする責務分離が運用負荷を下げます。実務上は Dockerfile の HEALTHCHECK をランタイムに不要なツールを入れずに実装する、cosign は署名とチェックサムを検証して導入する、Buildx と actions/cache はハッシュベースのキー設計と無効化手順を準備する、脆弱性は自動でチケット化して対応フローに組み込むことが重要です。

スポンサードリンク

お得なお知らせ

スポンサードリンク
1ヶ月で資格+現場入り

インフラエンジニアへの最短ルート

未経験でもAWS・Linux・ネットワーク資格を最短で取り、現場入りまでサポート。SREやクラウドエンジニアの入口。

CODE×CODEスピード転職|無料面談▶ SRE/クラウドのフリーランス案件▶

▶ AWS/GCP/Kubernetesの独学には Kindle Unlimited の技術書読み放題がコスパ最強。


-Docker