Para que GitHub cree una imagen de Docker, debes configurar una GitHub Action que use un Dockerfile en tu repositorio. La acción automática incluirá pasos para clonar tu código, iniciar sesión en el registro de contenedores (como GitHub Packages o Docker Hub), construir la imagen y luego enviarla al registro.
- Crea o asegúrate de tener un
Dockerfile: Este archivo contendrá todas las instrucciones para construir tu imagen. - Sube el
Dockerfiley tu código: Si aún no lo has hecho, sube elDockerfiley los archivos de tu aplicación a tu repositorio de GitHub.
- Crea un
Personal Access Token(PAT): Ve a la configuración de desarrollador de tu cuenta deGitHub, crea un nuevotokencon permisos parawrite:packagesyread:packages. - Guarda el token como un secreto: En tu repositorio, ve a
Settings>Secrets and variables>Actionsy crea una nueva variable de repositorio (por ejemplo,DOCKER_TOKEN) donde almacenes el valor del token.
- Crea un archivo
YAMLen tu repositorio: Dentro de la carpeta.github/workflows, crea un archivo, por ejemplo:docker-image.yml. - Define el evento de activación: Configura el flujo para que se ejecute automáticamente cada vez que se empuje (
push) o se envíe unpull requesta la rama principal u otra rama, por ejemplo:on: push: branches: [ main ] pull_request: branches: [ main ]
- Añade un trabajo (
job): Este trabajo contendrá los pasos para construir y enviar la imagen.
name: Build and Push Docker Image
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build-and-push-image:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- project: API
dockerfile: ./API/Dockerfile
image_name: mi-repositorio/api
- project: Web
dockerfile: ./Web/Dockerfile
image_name: mi-repositorio/web
steps:
- name: Checkout code
id: checkoutCode
uses: actions/checkout@v4 # Obtiene el código de tu repositorio
- name: Log in to GitHub Container Registry ${{ matrix.project }}
id: logInGitHub
uses: docker/login-action@v4 # Permite iniciar sesión en el registro de contenedores
with:
registry: ghcr.io # Usa el registro de contenedores de GitHub
username: ${{ github.actor }} # Usa tu nombre de usuario de GitHub
password: ${{ secrets.DOCKER_TOKEN }} # Usa el token de acceso personal guardado como secreto
- name: Build and push Docker image (${{ matrix.project }})
id: buildPushImage
uses: docker/build-push-action@v7 # Acción para construir y subir imágenes de Docker
with:
context: . # Construye desde el directorio raíz del proyecto
file: ${{ matrix.dockerfile }}
push: true # Sube la imagen al registro después de construirla
tags: | # Asigna etiquetas a la imagen
ghcr.io/${{ matrix.image_name }}:${{ github.sha }}
ghcr.io/${{ matrix.image_name }}:latest- Este ejemplo utiliza la acción
docker/login-actionpara iniciar sesión y la accióndocker/build-push-actionpara construir y publicar. - La etiqueta
ghcr.io/${{ github.repository }}se refieren a la URL del registro deGitHub, tu nombre de usuario y el nombre del repositorio. - Las etiquetas (
tags) crean 2 versiones de la imagen:- Una con el ID específico del commit (
${{ github.sha }}), útil para trazabilidad. - Otra con la etiqueta
latest, que siempre apunta a la versión más reciente.
- Una con el ID específico del commit (
- Este ejemplo está pensado para que el repositorio tenga 2 proyectos (aunque puede tener más proyectos o tener 1).
- Para crear dos o más imágenes
Dockera partir de proyectos ubicados en un solo repositorio deGitHub, la mejor práctica es utilizar una estrategia de matriz (matrix strategy). Esto te permite definir un solo flujo de trabajo (workflow) que construirá y subirá tus imágenes en paralelo, manteniendo el código limpio y evitando la repetición. Parafraceando del sitio web Stack Overflow. - Matriz (
matrix): La secciónincludedefine los detalles únicos de cada proyecto. Puedes agregar más bloques- project: app3...siguiendo la misma estructura.
- Para crear dos o más imágenes
- Guarda el archivo
YAMLen.github/workflows/y confirma los cambios en tu repositorio. GitHub Actionsejecutará automáticamente este flujo en la próxima inserción en la ramamain, construyendo y publicando tu imagen deDockerenGitHub Packages.