将 Docker Scout 与 GitLab CI/CD 集成
目录
以下示例在 GitLab CI 中运行,该 CI 用于包含 Docker 镜像定义及其内容的代码仓库。当有提交触发时,流水线会构建该镜像。如果提交的目标是默认分支,则使用 Docker Scout 生成 CVE 漏洞报告;如果提交的目标是其他分支,则使用 Docker Scout 将新版本与当前已发布的版本进行比较。
步骤
首先,设置工作流的其余部分。其中包含许多与 Docker Scout 无关但用于创建待比较镜像所必需的内容。
将以下内容添加到您仓库根目录下的 .gitlab-ci.yml 文件中。
docker-build:
image: docker:latest
stage: build
services:
- docker:dind
before_script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
# Install curl and the Docker Scout CLI
- |
apk add --update curl
curl -sSfL https://raw.githubusercontent.com/docker/scout-cli/main/install.sh | sh -s --
apk del curl
rm -rf /var/cache/apk/*
# Login to Docker Hub required for Docker Scout CLI
- echo "$DOCKER_HUB_PAT" | docker login -u "$DOCKER_HUB_USER" --password-stdin这将配置工作流,以Docker-in-Docker模式构建Docker镜像, 即在容器内部运行Docker。
随后下载 curl 和 Docker Scout CLI 插件,并使用您仓库设置中定义的环境变量登录到 Docker 注册表。
将以下内容添加到 YAML 文件中:
script:
- |
if [[ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]]; then
tag=""
echo "Running on default branch '$CI_DEFAULT_BRANCH': tag = 'latest'"
else
tag=":$CI_COMMIT_REF_SLUG"
echo "Running on branch '$CI_COMMIT_BRANCH': tag = $tag"
fi
- docker build --pull -t "$CI_REGISTRY_IMAGE${tag}" .
- |
if [[ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]]; then
# Get a CVE report for the built image and fail the pipeline when critical or high CVEs are detected
docker scout cves "$CI_REGISTRY_IMAGE${tag}" --exit-code --only-severity critical,high
else
# Compare image from branch with latest image from the default branch and fail if new critical or high CVEs are detected
docker scout compare "$CI_REGISTRY_IMAGE${tag}" --to "$CI_REGISTRY_IMAGE:latest" --exit-code --only-severity critical,high --ignore-unchanged
fi
- docker push "$CI_REGISTRY_IMAGE${tag}"这会创建之前提到的流程。如果提交的是默认分支,Docker Scout 将生成 CVE 报告。如果提交的是其他分支,Docker Scout 会将新版本与当前已发布的版本进行比较。它仅显示严重程度为“严重”或“高”的漏洞,并忽略自上次分析以来未发生变化的漏洞。
将以下内容添加到 YAML 文件中:
rules:
- if: $CI_COMMIT_BRANCH
exists:
- Dockerfile这些最后一行确保管道仅在提交包含 Dockerfile 且提交针对 CI 分支时才运行。
视频演示
以下是使用 GitLab 设置工作流的视频操作指南。