Intégrer Docker Scout avec GitLab CI/CD
L'exemple suivant s'exécute dans GitLab CI dans un dépôt contenant la définition et le contenu d'une image Docker. Déclenché par un commit, le pipeline construit l'image. Si le commit était sur la branche par défaut, il utilise Docker Scout pour obtenir un rapport CVE. Si le commit était sur une branche différente, il utilise Docker Scout pour comparer la nouvelle version à la version actuellement publiée.
Étapes
D'abord, configurez le reste du workflow. Il y a beaucoup qui n'est pas spécifique à Docker Scout mais nécessaire pour créer les images à comparer.
Ajoutez ce qui suit à un fichier .gitlab-ci.yml
à la racine de votre dépôt.
docker-build:
image: docker:latest
stage: build
services:
- docker:dind
before_script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
# Installer curl et le CLI Docker Scout
- |
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/*
# Connexion à Docker Hub requise pour le CLI Docker Scout
- echo "$DOCKER_HUB_PAT" | docker login -u "$DOCKER_HUB_USER" --password-stdin
Ceci configure le workflow pour construire des images Docker avec le mode Docker-in-Docker, exécutant Docker à l'intérieur d'un conteneur.
Il télécharge ensuite curl
et le plugin CLI Docker Scout, se connecte au registre
Docker en utilisant les variables d'environnement définies dans les paramètres de votre dépôt.
Ajoutez ce qui suit au fichier YAML :
script:
- |
if [[ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]]; then
tag=""
echo "Exécution sur la branche par défaut '$CI_DEFAULT_BRANCH': tag = 'latest'"
else
tag=":$CI_COMMIT_REF_SLUG"
echo "Exécution sur la branche '$CI_COMMIT_BRANCH': tag = $tag"
fi
- docker build --pull -t "$CI_REGISTRY_IMAGE${tag}" .
- |
if [[ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]]; then
# Obtenir un rapport CVE pour l'image construite et faire échouer le pipeline quand des CVE critiques ou élevés sont détectés
docker scout cves "$CI_REGISTRY_IMAGE${tag}" --exit-code --only-severity critical,high
else
# Comparer l'image de la branche avec la dernière image de la branche par défaut et échouer si de nouveaux CVE critiques ou élevés sont détectés
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}"
Ceci crée le flux mentionné précédemment. Si le commit était sur la branche par défaut, Docker Scout génère un rapport CVE. Si le commit était sur une branche différente, Docker Scout compare la nouvelle version à la version actuellement publiée. Il ne montre que les vulnérabilités de gravité critique ou élevée et ignore les vulnérabilités qui n'ont pas changé depuis la dernière analyse.
Ajoutez ce qui suit au fichier YAML :
rules:
- if: $CI_COMMIT_BRANCH
exists:
- Dockerfile
Ces lignes finales s'assurent que le pipeline ne s'exécute que si le commit contient un Dockerfile et si le commit était sur la branche CI.
Présentation vidéo
Ce qui suit est une présentation vidéo du processus de configuration du workflow avec GitLab.