Docker Scout를 GitLab CI/CD와 통합하기
Docker Scout를 GitLab CI/CD와 통합하기
다음 예시는 Docker 이미지의 정의와 내용을 포함한 저장소의 GitLab CI에서 실행돼요. 커밋으로 트리거된 파이프라인은 이미지를 빌드해요. 커밋이 기본 브랜치에 있었다면 Docker Scout로 CVE 보고서를 얻고, 다른 브랜치에 있었다면 Docker Scout로 새 버전을 현재 게시 버전과 비교해요.
단계 (Steps)
먼저 나머지 워크플로를 설정하세요. 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
# curl과 Docker Scout CLI 설치 (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/*
# Docker Scout CLI에 필요한 Docker Hub 로그인 (Login to Docker Hub required for Docker Scout CLI)
- echo "$DOCKER_HUB_PAT" | docker login -u "$DOCKER_HUB_USER" --password-stdin
이것은 컨테이너 안에서 Docker를 실행하는 Docker-in-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
# 빌드된 이미지에 대한 CVE 보고서를 얻고 critical/high CVE가 감지되면 파이프라인 실패
docker scout cves "$CI_REGISTRY_IMAGE${tag}" --exit-code --only-severity critical,high
else
# 브랜치의 이미지를 기본 브랜치의 latest 이미지와 비교하고 새 critical/high CVE가 감지되면 실패
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는 새 버전을 현재 게시 버전과 비교해요. critical 또는 high 심각도 취약점만 보여 주고, 마지막 분석 이후 변경되지 않은 취약점은 무시해요.
YAML 파일에 다음을 추가하세요.
rules:
- if: $CI_COMMIT_BRANCH
exists:
- Dockerfile
이 마지막 줄들은 커밋에 Dockerfile이 포함되고 CI 브랜치에 대한 커밋일 때만 파이프라인이 실행되도록 보장해요.
동영상 워크스루 (Video walkthrough)
다음은 GitLab으로 워크플로를 설정하는 과정의 동영상 워크스루예요.