Compartir comentarios
Las respuestas se generan en base a la documentación.

Integrar Docker Scout con GitHub Actions

Tabla de contenidos

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=max

Esto crea pasos en el flujo de trabajo para:

  1. Configurar Docker Buildx.
  2. Autenticarse en el registro.
  3. Extraer metadatos de la referencia de Git y de los eventos de GitHub.
  4. Construir y cargar la imagen de Docker en el registro.
Note

Este 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.

Captura de pantalla que muestra los resultados de la salida de Docker Scout en una GitHub Action

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.

Salida de evaluación de políticas de GHA