Integrar Docker Scout con GitHub Actions
El siguiente ejemplo muestra cómo configurar un flujo de trabajo de Docker Scout con GitHub Actions. Activada por una pull request, la acción construye la imagen y utiliza Docker Scout para comparar la nueva versión con la versión de esa imagen que se está ejecutando en producción.
Este flujo de trabajo utiliza la GitHub Action
docker/scout-action para
ejecutar el comando docker scout compare y visualizar cómo se comparan las imágenes de la pull request
con la imagen que ejecutas en producción.
Requisitos previos
- Este ejemplo asume que tienes un repositorio de imágenes existente, en Docker Hub o en otro registro, donde hayas habilitado Docker Scout.
- Este ejemplo hace uso de entornos para comparar
la imagen construida en la pull request con una versión diferente de la misma imagen
en un entorno llamado
production.
Pasos
Primero, configura el flujo de trabajo de GitHub Actions para construir una imagen. Esto no es específico de Docker Scout aquí, pero necesitarás construir una imagen para tener algo con qué comparar.
Añade lo siguiente a un archivo YAML de GitHub Actions:
name: Docker
on:
push:
tags: ["*"]
branches:
- "main"
pull_request:
branches: ["**"]
env:
# Hostname of your registry
REGISTRY: docker.io
# Image repository, without hostname and 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:
# Authenticate to the container registry
- name: Authenticate to registry ${{ env.REGISTRY }}
uses: docker/login-action@v4
with:
registry: ${{ env.REGISTRY }}
username: ${{ secrets.REGISTRY_USER }}
password: ${{ secrets.REGISTRY_TOKEN }}
- name: Setup Docker buildx
uses: docker/setup-buildx-action@v4
# Extract metadata (tags, labels) for Docker
- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v6
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
# Build and push Docker image with Buildx
# (don't push on PR, load instead)
- name: Build and push Docker image
id: build-and-push
uses: docker/build-push-action@v7
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=maxEsto crea pasos en el flujo de trabajo para:
- Configurar Docker Buildx.
- Autenticarse en el registro.
- Extraer metadatos de la referencia de Git y de los eventos de GitHub.
- Construir y cargar la imagen de Docker en el registro.
NoteEste flujo de trabajo de CI ejecuta un análisis y evaluación local de tu imagen. Para evaluar la imagen localmente, debes asegurarte de que la imagen se cargue en el almacenamiento local de imágenes de tu runner.
Esta comparación no funciona si subes la imagen a un registro, o si construyes una imagen que no se puede cargar en el almacenamiento de imágenes local del runner. Por ejemplo, las imágenes multiplataforma o las imágenes con atestación SBOM o de procedencia no se pueden cargar en el almacenamiento local de imágenes.
Con esta configuración lista, puedes añadir los siguientes pasos para ejecutar la comparación de imágenes:
# You can skip this step if Docker Hub is your registry
# and you already authenticated before
- name: Authenticate to Docker
uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKER_USER }}
password: ${{ secrets.DOCKER_PAT }}
# Compare the image built in the pull request with the one in 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 }}El comando compare analiza la imagen y evalúa el cumplimiento de las políticas, y
cruza los resultados con la imagen correspondiente en el entorno production. Este ejemplo solo incluye vulnerabilidades de gravedad crítica y alta, y excluye las vulnerabilidades que existen en ambas imágenes,
mostrando solo lo que ha cambiado.
GitHub Action muestra los resultados de la comparación en un comentario de la pull request de forma predeterminada.

Expande la sección Policies para ver la diferencia en el cumplimiento de políticas entre las dos imágenes. Ten en cuenta que, aunque la nueva imagen de este ejemplo no es completamente conforme, la salida muestra que la situación de la nueva imagen ha mejorado en comparación con la línea base.
