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

Contextos con nombre con GitHub Actions

Puedes definir contextos de compilación adicionales y acceder a ellos en tu Dockerfile con FROM nombre o --from=nombre. Cuando el Dockerfile define una etapa con el mismo nombre, esta se sobrescribe.

Esto puede ser útil con GitHub Actions para reutilizar resultados de otras compilaciones o fijar una imagen a una etiqueta específica en tu flujo de trabajo.

Fijar una imagen a una etiqueta

Reemplaza alpine:latest con una versión fija:

# syntax=docker/dockerfile:1
FROM alpine
RUN echo "Hello World"
name: ci

on:
  push:

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: Configurar Docker Buildx
        uses: docker/setup-buildx-action@v4

      - name: Compilar
        uses: docker/build-push-action@v7
        with:
          build-contexts: |
            alpine=docker-image://alpine:3.23
          tags: myimage:latest

Usar una imagen en pasos posteriores

Por defecto, la acción Docker Setup Buildx utiliza docker-container como controlador de compilación, por lo que las imágenes de Docker compiladas no se cargan automáticamente.

Con contextos con nombre puedes reutilizar la imagen compilada:

# syntax=docker/dockerfile:1
FROM alpine
RUN echo "Hello World"
name: ci

on:
  push:

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: Configurar Docker Buildx
        uses: docker/setup-buildx-action@v4
        with:
          driver: docker

      - name: Compilar imagen base
        uses: docker/build-push-action@v7
        with:
          context: "{{defaultContext}}:base"
          load: true
          tags: my-base-image:latest

      - name: Compilar
        uses: docker/build-push-action@v7
        with:
          build-contexts: |
            alpine=docker-image://my-base-image:latest
          tags: myimage:latest

Uso con un constructor de contenedores

Como se muestra en la sección anterior, no se utiliza el controlador predeterminado docker-container driver para compilar con contextos con nombre. Esto se debe a que este controlador no puede cargar una imagen desde el almacén de Docker ya que está aislado. Para solucionar este problema, puedes usar un registro local para enviar tu imagen base en tu flujo de trabajo:

# syntax=docker/dockerfile:1
FROM alpine
RUN echo "Hello World"
name: ci

on:
  push:

jobs:
  docker:
    runs-on: ubuntu-latest
    services:
      registry:
        image: registry:3
        ports:
          - 5000:5000
    steps:
      - name: Configurar QEMU
        uses: docker/setup-qemu-action@v4

      - name: Configurar Docker Buildx
        uses: docker/setup-buildx-action@v4
        with:
          # Se necesita driver-opts con network=host para enviar al registro local
          driver-opts: network=host

      - name: Compilar imagen base
        uses: docker/build-push-action@v7
        with:
          context: "{{defaultContext}}:base"
          tags: localhost:5000/my-base-image:latest
          push: true

      - name: Compilar
        uses: docker/build-push-action@v7
        with:
          build-contexts: |
            alpine=docker-image://localhost:5000/my-base-image:latest
          tags: myimage:latest