Docker Scout を GitHub Actions と連携する
以下の例では、GitHub Actions で Docker Scout のワークフローを設定する方法を示しています。このアクションはプルリクエストによってトリガーされ、イメージをビルドし、その新しいバージョンを本番環境で稼働中のイメージと比較します。
このワークフローは、docker scout compare
コマンドを実行するために docker/scout-action GitHub Action を使用しており、プルリクエストのイメージが本番環境で稼働しているイメージとどのように比較されるかを可視化します。
前提条件
- この例では、Docker Hubまたは他のレジストリにDocker Scoutを有効にした既存のイメージリポジトリがあることを前提としています。
- この例では、実行環境 を使用して、プルリクエストでビルドされたイメージを
production
という環境での同じイメージの異なるバージョンと比較します。
手順
まず、GitHub Actions ワークフローを設定してイメージをビルドします。ここでは Docker Scout に特化したものではありませんが、比較するためのイメージをビルドする必要があります。
以下を GitHub Actions の YAML ファイルに追加します。
name: Docker
on:
push:
tags: ["*"]
branches:
- "main"
pull_request:
branches: ["**"]
env:
# レジストリのホスト名
REGISTRY: docker.io
# イメージリポジトリ(ホスト名とタグなし)
IMAGE_NAME: ${{ github.repository }}
SHA: ${{ github.event.pull_request.head.sha || github.event.after }}
jobs:
build:
runs-on: ubuntu-latest
permissions:
pull-requests: write
steps:
- name: Docker buildx のセットアップ
uses: docker/setup-buildx-action@v3
# コンテナレジストリへの認証
- name: レジストリ ${{ env.REGISTRY }} への認証
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ secrets.REGISTRY_USER }}
password: ${{ secrets.REGISTRY_TOKEN }}
# Docker メタデータを抽出
- name: Docker メタデータの抽出
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
labels: |
org.opencontainers.image.revision=${{ env.SHA }}
tags: |
type=edge,branch=$repo.default_branch
type=semver,pattern=v{{version}}
type=sha,prefix=,suffix=,format=short
# Buildx で Docker イメージをビルドおよびプッシュ
# (プルリクエスト時にはプッシュせず、ロードのみ)
- name: Docker イメージのビルドとプッシュ
id: build-and-push
uses: docker/build-push-action@v6
with:
sbom: ${{ github.event_name != 'pull_request' }}
provenance: ${{ github.event_name != 'pull_request' }}
push: ${{ github.event_name != 'pull_request' }}
load: ${{ github.event_name == 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
このワークフローは以下のステップを実行します。
- Docker buildx をセットアップします。
- レジストリへの認証を行います。
- Git リファレンスや GitHub イベントからメタデータを抽出します。
- Dockerイメージをビルドし、レジストリにプッシュします。
このCIワークフローはローカルのイメージ分析と評価を実行します。イメージをローカルで評価するためには、ランナーのローカルイメージストアにイメージがロードされている必要があります。
イメージをレジストリにプッシュした場合や、マルチプラットフォームイメージ、SBOMや証明書付きイメージなどがローカルイメージストアにロードできない場合、この比較は機能しません。
この設定が完了したら、イメージの比較を実行するための以下のステップを追加します。
# Docker Hubがレジストリの場合、このステップをスキップできます
# 既に認証されているため
- name: Dockerへの認証
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USER }}
password: ${{ secrets.DOCKER_PAT }}
# プルリクエストでビルドされたイメージを本番環境のイメージと比較
- name: Docker Scout
id: docker-scout
if: ${{ github.event_name == 'pull_request' }}
uses: docker/scout-action@v1
with:
command: compare
image: ${{ steps.meta.outputs.tags }}
to-env: production
ignore-unchanged: true
only-severities: critical,high
github-token: ${{ secrets.GITHUB_TOKEN }}
compare
コマンドはイメージを分析し、ポリシーコンプライアンスを評価します。そして結果を production
環境の対応するイメージと照合します。この例では、重大および高リスクの脆弱性のみを含み、両方のイメージに存在する脆弱性は除外され、変更があったもののみが表示されます。
GitHub Action は、比較結果をプルリクエストコメントにデフォルトで出力します。
Policies セクションを展開すると、2つのイメージ間のポリシーコンプライアンスの違いを確認できます。この例では、新しいイメージは完全には準拠していませんが、ベースラインと比較して新しいイメージの評価が改善されたことが表示されています。