Skip to Content

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

このワークフローは以下のステップを実行します。

  1. Docker buildx をセットアップします。
  2. レジストリへの認証を行います。
  3. Git リファレンスや GitHub イベントからメタデータを抽出します。
  4. 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 は、比較結果をプルリクエストコメントにデフォルトで出力します。

Docker Scout の出力結果を表示した GitHub Action のスクリーンショット

Policies セクションを展開すると、2つのイメージ間のポリシーコンプライアンスの違いを確認できます。この例では、新しいイメージは完全には準拠していませんが、ベースラインと比較して新しいイメージの評価が改善されたことが表示されています。

GHA ポリシー評価の出力

Last updated on