# Contextos con nombre con GitHub Actions


Puedes definir [contextos de compilación adicionales](/reference/cli/docker/buildx/build/#build-context)
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:

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

```yaml
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](https://github.com/marketplace/actions/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:

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

```yaml
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`](/build/builders/drivers/docker-container/) 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](/build/ci/github-actions/named-contexts/local-registry/) para enviar tu imagen base en tu flujo de trabajo:

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

```yaml
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
```

