Workflow de GitHub Actions para construir y publicar una imagen Docker en GHCR
Un workflow que construye la imagen Docker de tu repositorio y la publica en GitHub Container Registry (ghcr.io) al subir a main o crear una etiqueta v*. No necesita ningún secreto: usa el GITHUB_TOKEN. Este es el YAML exacto que genera la aplicación.
Cuándo usarla
- Tu repositorio tiene un Dockerfile en la raíz.
- Quieres publicar la imagen en ghcr.io sin crear secretos.
- Quieres que los pull requests solo construyan la imagen, sin publicarla.
El workflow completo
name: Docker
on:
push:
branches:
- main
tags:
- v*
pull_request:
branches:
- main
workflow_dispatch:
permissions:
contents: read
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
imagen:
name: Construir y publicar la imagen
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
timeout-minutes: 30
steps:
- name: Descargar el código (actions/checkout v7.0.1)
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- name: Preparar Buildx (docker/setup-buildx-action v4.4.1)
uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069
- name: Iniciar sesión en GHCR (docker/login-action v4.6.0)
if: github.event_name != 'pull_request'
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- id: meta
name: Calcular etiquetas y metadatos (docker/metadata-action v6.2.0)
uses: docker/metadata-action@dc802804100637a589fabce1cb79ff13a1411302
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=ref,event=branch
type=ref,event=tag
type=sha
- name: Construir y publicar (docker/build-push-action v7.4.0)
uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc
with:
context: .
push: ${{ 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
Es un punto de partida: puedes abrirlo en el editor, cambiar eventos, jobs y steps, y la aplicación lo vuelve a validar antes de generar el archivo.
Antes de usarla
- Necesita un Dockerfile en la raíz del repositorio.
- Publica en ghcr.io/<tu-usuario>/<repositorio> con el GITHUB_TOKEN; no hace falta ningún secreto.
- En los pull requests solo construye (no publica).
- Si el repositorio es de una organización, comprueba que los workflows pueden escribir paquetes (Ajustes → Actions).
Qué hace cada parte
- EventosSe ejecuta al subir a main, al crear una etiqueta que empiece por v, en los pull requests hacia main y a mano desde la pestaña Actions.
- Publicar solo cuando tocaEl inicio de sesión en GHCR y la publicación solo ocurren fuera de los pull requests; en un pull request la imagen se construye pero no se publica.
- Permisos mínimos y acotadosEl workflow pide solo lectura de contenido; el único permiso de escritura (packages: write) está dentro del job que publica, no en todo el workflow.
- Etiquetas y metadatosLas etiquetas de la imagen se calculan a partir de la rama, la etiqueta de Git y el commit.
- Caché de capasSe usa la caché de GitHub Actions para las capas de Docker, lo que acelera construcciones repetidas.
- Seguridad y tiempo máximoLas acciones de terceros van fijadas a un SHA de commit concreto (con la versión legible en el nombre del step), no a una etiqueta móvil. Cada job tiene un tiempo máximo (timeout-minutes) para que un cuelgue no consuma minutos sin fin.
Cómo usarla en tu repositorio
- Guarda el archivo en la carpeta .github/workflows/ de tu repositorio.
- Súbelo (commit y push). GitHub detecta el workflow y lo ejecuta según sus eventos.
- Mira el resultado en la pestaña Actions del repositorio.
Preguntas frecuentes
¿Necesito crear algún secreto?
No. El inicio de sesión usa el GITHUB_TOKEN que GitHub genera en cada ejecución, con el permiso packages: write solo en el job que publica.
¿Qué reviso si mi repositorio es de una organización y falla al publicar?
Comprueba en los ajustes de Actions de la organización que los workflows pueden escribir paquetes (Ajustes → Actions).
¿Dónde queda publicada la imagen?
En ghcr.io/<tu-usuario>/<repositorio>, con las etiquetas calculadas por el workflow. La visibilidad del paquete se gestiona en GitHub.
Otras plantillas
- Workflow de GitHub Actions para Python (pytest)Instala dependencias y ejecuta pytest en varias versiones de Python con cache de pip.
- Workflow de GitHub Actions para Node.js (lint, pruebas y build)Instala con npm ci y ejecuta lint, pruebas y build en varias versiones de Node con cache de npm.
Pruébalo gratis
El editor está disponible con una cuenta gratuita, con límites de uso. Nada se ejecuta en tu repositorio ni en tu instalación: tú decides qué archivo usas.