將 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
這將建立工作流步驟以
- 設定 Docker buildx。
- 向登錄檔進行身份驗證。
- 從 Git 引用和 GitHub 事件中提取元資料。
- 構建 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 預設會在拉取請求評論中輸出比較結果。


展開“**策略**”部分以檢視兩個映象之間策略合規性的差異。請注意,儘管本示例中的新映象並非完全合規,但輸出顯示新映象的狀態已較基線有所改善。

