Integrar Docker Scout con GitLab CI/CD
Los siguientes ejemplos se ejecutan en GitLab CI en un repositorio que contiene la definición y el contenido de una imagen de Docker. Activado por un commit, el pipeline construye la imagen. Si el commit se realizó en la rama predeterminada, utiliza Docker Scout para obtener un informe de CVEs. Si el commit se realizó en una rama diferente, utiliza Docker Scout para comparar la nueva versión con la versión publicada actualmente.
Pasos
Primero, configura el resto del flujo de trabajo. Hay muchos elementos que no son específicos de Docker Scout pero que son necesarios para crear las imágenes que se van a comparar.
Añade lo siguiente a un archivo .gitlab-ci.yml en la raíz de tu repositorio.
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-stdinEsto configura el flujo de trabajo para construir imágenes de Docker con el modo Docker-in-Docker, ejecutando Docker dentro de un contenedor.
Luego, descarga curl y el plugin de la CLI de Docker Scout, e inicia sesión en el registro de Docker
utilizando las variables de entorno definidas en la configuración de tu repositorio.
Añade lo siguiente al archivo 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}"Esto crea el flujo mencionado anteriormente. Si el commit se realizó en la rama predeterminada, Docker Scout genera un informe de CVEs. Si el commit se realizó en una rama diferente, Docker Scout compara la nueva versión con la versión publicada actualmente. Solo muestra vulnerabilidades de gravedad crítica o alta e ignora aquellas vulnerabilidades que no han cambiado desde el último análisis.
Añade lo siguiente al archivo YAML:
rules:
- if: $CI_COMMIT_BRANCH
exists:
- DockerfileEstas líneas finales aseguran que el pipeline solo se ejecute si el commit contiene un Dockerfile y si el commit se realizó en la rama de CI.
Videotutorial
A continuación, se muestra un videotutorial del proceso de configuración del flujo de trabajo con GitLab.