将 Docker Scout 与 GitHub Actions 集成
以下示例展示了如何使用 GitHub Actions 设置 Docker Scout 工作流。当触发拉取请求(pull request)时,该操作将构建镜像,并使用 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 工作流将对您的镜像进行本地分析与评估。要实现本地评估,您需确保镜像已加载至运行器(runner)的本地镜像存储中。
如果您将镜像推送到注册表,或者构建一个无法加载到运行器本地镜像存储中的镜像,则此比较将不起作用。例如,多平台镜像,或包含SBOM(软件物料清单)或来源证明(provenance)声明的镜像,无法加载到本地镜像存储中。
完成上述设置后,您可以添加以下步骤来运行镜像比较:
# 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 }}compare 命令用于分析镜像、评估策略合规性,并将结果与 production 环境中对应的镜像进行交叉比对。本示例仅包含严重性和高危性漏洞,且排除了在两份镜像中均存在的漏洞,仅展示已发生变更的内容。
GitHub Action 默认情况下会将比较结果以拉取请求(pull request)评论的形式输出。

展开 策略 部分以查看两个镜像在策略合规性方面的差异。请注意,尽管本示例中的新镜像尚未完全合规,但输出结果表明其合规状态已相比基线有所改善。
