Intégrer Docker Scout avec GitHub Actions
L'exemple suivant montre comment configurer un workflow Docker Scout avec GitHub Actions. Déclenché par une pull request, l'action construit l'image et utilise Docker Scout pour comparer la nouvelle version à la version de cette image en cours d'exécution en production.
Ce workflow utilise l'Action GitHub
docker/scout-action pour
exécuter la commande docker scout compare
pour visualiser comment les images des pull requests
se comparent à l'image que vous exécutez en production.
Prérequis
- Cet exemple suppose que vous avez un dépôt d'images existant, dans Docker Hub ou dans un autre registre, où vous avez activé Docker Scout.
- Cet exemple utilise les environnements, pour comparer
l'image construite dans la pull request avec une version différente de la même image
dans un environnement appelé
production
.
Étapes
D'abord, configurez le workflow GitHub Action pour construire une image. Ceci n'est pas spécifique à Docker Scout ici, mais vous devrez construire une image pour avoir quelque chose à comparer.
Ajoutez ce qui suit à un fichier YAML GitHub Actions :
name: Docker
on:
push:
tags: ["*"]
branches:
- "main"
pull_request:
branches: ["**"]
env:
# Nom d'hôte de votre registre
REGISTRY: docker.io
# Dépôt d'images, sans nom d'hôte et tag
IMAGE_NAME: ${{ github.repository }}
SHA: ${{ github.event.pull_request.head.sha || github.event.after }}
jobs:
build:
runs-on: ubuntu-latest
permissions:
pull-requests: write
steps:
# S'authentifier auprès du registre de conteneurs
- name: Authenticate to registry ${{ env.REGISTRY }}
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ secrets.REGISTRY_USER }}
password: ${{ secrets.REGISTRY_TOKEN }}
- name: Setup Docker buildx
uses: docker/setup-buildx-action@v3
# Extraire les métadonnées (tags, labels) pour Docker
- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
labels: |
org.opencontainers.image.revision=${{ env.SHA }}
tags: |
type=edge,branch=$repo.default_branch
type=semver,pattern=v{{version}}
type=sha,prefix=,suffix=,format=short
# Construire et pousser l'image Docker avec Buildx
# (ne pas pousser sur PR, charger à la place)
- name: Build and push Docker image
id: build-and-push
uses: docker/build-push-action@v6
with:
sbom: ${{ github.event_name != 'pull_request' }}
provenance: ${{ github.event_name != 'pull_request' }}
push: ${{ github.event_name != 'pull_request' }}
load: ${{ github.event_name == 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
Ceci crée des étapes de workflow pour :
- Configurer Docker buildx.
- S'authentifier auprès du registre.
- Extraire les métadonnées de la référence Git et des événements GitHub.
- Construire et pousser l'image Docker vers le registre.
NoteCe workflow CI exécute une analyse et évaluation locale de votre image. Pour évaluer l'image localement, vous devez vous assurer que l'image est chargée dans le magasin d'images local de votre runner.
Cette comparaison ne fonctionne pas si vous poussez l'image vers un registre, ou si vous construisez une image qui ne peut pas être chargée dans le magasin d'images local du runner. Par exemple, les images multi-plateformes ou les images avec attestation SBOM ou de provenance ne peuvent pas être chargées dans le magasin d'images local.
Avec cette configuration terminée, vous pouvez ajouter les étapes suivantes pour exécuter la comparaison d'images :
# Vous pouvez ignorer cette étape si Docker Hub est votre registre
# et que vous vous êtes déjà authentifié avant
- name: Authenticate to Docker
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USER }}
password: ${{ secrets.DOCKER_PAT }}
# Comparer l'image construite dans la pull request avec celle en production
- name: Docker Scout
id: docker-scout
if: ${{ github.event_name == 'pull_request' }}
uses: docker/scout-action@v1
with:
command: compare
image: ${{ steps.meta.outputs.tags }}
to-env: production
ignore-unchanged: true
only-severities: critical,high
github-token: ${{ secrets.GITHUB_TOKEN }}
La commande compare analyse l'image et évalue la conformité des politiques, et
croise les résultats avec l'image correspondante dans l'environnement production
.
Cet exemple inclut seulement les vulnérabilités de gravité critique et élevée,
et exclut les vulnérabilités qui existent dans les deux images,
montrant seulement ce qui a changé.
L'Action GitHub affiche les résultats de comparaison dans un commentaire de pull request par défaut.


Développez la section Politiques pour voir la différence de conformité des politiques entre les deux images. Notez que bien que la nouvelle image dans cet exemple ne soit pas entièrement conforme, la sortie montre que la position de la nouvelle image s'est améliorée comparée à la ligne de base.

