將 Docker Scout 與 GitHub Actions 整合

以下範例說明如何使用 GitHub Actions 設定 Docker Scout 工作流程。觸發拉取請求後,動作會建置映像檔,並使用 Docker Scout 將新版本與生產環境中執行的映像檔版本進行比較。

此工作流程使用 docker/scout-action GitHub Action 來執行 `docker scout compare` 命令,以視覺化拉取請求的映像檔與您在生產環境中執行的映像檔的比較。

先決條件

  • 此範例假設您在 Docker Hub 或其他已啟用 Docker Scout 的登錄檔中,有一個現有的映像檔儲存庫。
  • 此範例使用環境,將拉取請求中建置的映像檔與名為 `production` 的環境中相同映像檔的不同版本進行比較。

步驟

首先,設定 GitHub Action 工作流程來建置映像檔。這並非 Docker Scout 的特定設定,但您需要建置映像檔才能進行比較。

將以下內容新增至 GitHub Actions YAML 檔案

name: Docker

on:
  push:
    tags: ["*"]
    branches:
      - "main"
  pull_request:
    branches: ["**"]

env:
  # Hostname of your registry
  REGISTRY: docker.io
  # Image repository, without hostname and tag
  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:
      # Authenticate to the container registry
      - name: Authenticate to registry ${{ env.REGISTRY }}
        uses: docker/login-action@v3
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ secrets.REGISTRY_USER }}
          password: ${{ secrets.REGISTRY_TOKEN }}
      
      - name: Setup Docker buildx
        uses: docker/setup-buildx-action@v3

      # Extract metadata (tags, labels) for Docker
      - name: Extract Docker metadata
        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            

      # Build and push Docker image with Buildx
      # (don't push on PR, load instead)
      - name: Build and push Docker image
        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 或來源證明驗證的映像檔無法載入至本機映像檔存放區。

完成此設定後,您可以新增下列步驟來執行映像檔比較

      # You can skip this step if Docker Hub is your registry
      # and you already authenticated before
      - name: Authenticate to Docker
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USER }}
          password: ${{ secrets.DOCKER_PAT }}

      # Compare the image built in the pull request with the one in production
      - 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 }}

比較命令會分析映像檔並評估政策合規性,並將結果與 `production` 環境中的對應映像檔進行交互參考。此範例僅包含嚴重性和高嚴重性弱點,並排除兩個映像檔中都存在的弱點,僅顯示已變更的內容。

GitHub Action 預設會在拉取請求註解中輸出比較結果。

A screenshot showing the results of Docker Scout output in a GitHub Action

展開**政策**區段,以檢視兩個映像檔之間政策合規性的差異。請注意,雖然此範例中的新映像檔並未完全符合規範,但輸出顯示新映像檔的狀態與基準相比有所改善。

GHA policy evaluation output