將 Docker Scout 與 GitLab CI/CD 整合
目錄
以下範例在 GitLab 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 設定工作流程的影片教學。