⚠️ Traduction non officielle - Cette documentation est une traduction communautaire non officielle de Docker.

Intégrer Docker Scout avec GitLab CI/CD

Table des matières

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.