Introducción a GitHub Actions con Docker
Esta guía ofrece una introducción a la creación de tuberías (pipelines) de CI utilizando Docker y GitHub Actions. Aprenderás a usar las GitHub Actions oficiales de Docker para construir tu aplicación como una imagen de Docker y publicarla en Docker Hub. Al final de la guía, tendrás una configuración simple y funcional de GitHub Actions para las construcciones de Docker. Utilízala tal como está o amplíala según tus necesidades.
Requisitos previos
Si deseas seguir la guía paso a paso, asegúrate de tener lo siguiente:
- Una cuenta de Docker verificada.
- Familiaridad con los Dockerfiles.
Esta guía asume conocimientos básicos sobre los conceptos de Docker, pero proporciona explicaciones para utilizar Docker en los flujos de trabajo de GitHub Actions.
Obtener la aplicación de ejemplo
Esta guía es independiente del proyecto y asume que tienes una aplicación con un Dockerfile.
Si necesitas un proyecto de ejemplo para seguir los pasos, puedes usar esta aplicación de ejemplo, que incluye un Dockerfile para construir una versión contenerizada de la aplicación. Alternativamente, utiliza tu propio proyecto de GitHub o crea un nuevo repositorio a partir de la plantilla.
#syntax=docker/dockerfile:1
# builder installs dependencies and builds the node app
FROM node:lts-alpine AS builder
WORKDIR /src
RUN --mount=src=package.json,target=package.json \
--mount=src=package-lock.json,target=package-lock.json \
--mount=type=cache,target=/root/.npm \
npm ci
COPY . .
RUN --mount=type=cache,target=/root/.npm \
npm run build
# release creates the runtime image
FROM node:lts-alpine AS release
WORKDIR /app
COPY --from=builder /src/build .
EXPOSE 3000
CMD ["node", "."]Configurar tu repositorio de GitHub
El flujo de trabajo de esta guía publica la imagen que construyes en Docker Hub. Para hacer eso, debes autenticarte con tus credenciales de Docker (nombre de usuario y token de acceso) como parte del flujo de trabajo de GitHub Actions.
Para obtener instrucciones sobre cómo crear un token de acceso de Docker, consulta Crear y gestionar tokens de acceso.
Una vez que tengas listas tus credenciales de Docker, agrégalas a tu repositorio de GitHub para poder usarlas en GitHub Actions:
- Abre la Configuración (Settings) de tu repositorio.
- En Seguridad (Security), ve a Secrets and variables > Actions.
- En Secrets, crea un nuevo secreto de repositorio llamado
DOCKER_PASSWORDque contenga tu token de acceso de Docker. - A continuación, en Variables, crea una variable de repositorio
DOCKER_USERNAMEque contenga tu nombre de usuario de Docker Hub.
Configurar tu flujo de trabajo de GitHub Actions
Los flujos de trabajo de GitHub Actions definen una serie de pasos para automatizar tareas, como construir y publicar imágenes de Docker, en respuesta a desencadenadores (triggers) como confirmaciones (commits) o solicitudes de extracción (pull requests). En esta guía, el flujo de trabajo se centra en automatizar las construcciones y pruebas de Docker, asegurando que tu aplicación contenerizada funcione correctamente antes de publicarla.
Crea un archivo llamado docker-ci.yml en el directorio .github/workflows/ de
tu repositorio. Comienza con la configuración básica del flujo de trabajo:
name: Build and Push Docker Image
on:
push:
branches:
- main
pull_request:Esta configuración ejecuta el flujo de trabajo al realizar confirmaciones en la rama main y en las solicitudes de extracción. Al incluir ambos desencadenadores, puedes asegurarte de que la imagen se construya correctamente para una solicitud de extracción antes de que se fusione.
Extraer metadatos para etiquetas y anotaciones
Para el primer paso de tu flujo de trabajo, utiliza docker/metadata-action para
generar metadatos para tu imagen. Esta acción extrae información sobre tu
repositorio de Git, como los nombres de las ramas y los SHAs de las confirmaciones, y genera
metadatos de la imagen, como etiquetas y anotaciones.
Agrega el siguiente YAML a tu archivo de flujo de trabajo:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Extract Docker image metadata
id: meta
uses: docker/metadata-action@v6
with:
images: ${{ vars.DOCKER_USERNAME }}/my-imageEstos pasos preparan los metadatos para etiquetar y anotar tus imágenes durante el proceso de construcción y publicación.
- El paso Checkout clona el repositorio de Git.
- El paso Extract Docker image metadata extrae los metadatos de Git y genera etiquetas y anotaciones de imagen para la construcción de Docker.
Autenticarse en tu registro
Antes de construir la imagen, autentícate en tu registro para asegurarte de que puedes publicar la imagen construida en él.
Para autenticarte con Docker Hub, agrega el siguiente paso a tu flujo de trabajo:
- name: Log in to Docker Hub
uses: docker/login-action@v4
with:
username: ${{ vars.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}Este paso utiliza las credenciales de Docker configuradas en la configuración del repositorio.
Construir y publicar la imagen
Finalmente, construye la imagen de producción final y publícala en tu registro. La siguiente configuración construye la imagen y la publica directamente en un registro.
- name: Build and push Docker image
uses: docker/build-push-action@v7
with:
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
annotations: ${{ steps.meta.outputs.annotations }}En esta configuración:
push: ${{ github.event_name != 'pull_request' }}asegura que las imágenes solo se publiquen cuando el evento no sea una solicitud de extracción. De esta manera, el flujo de trabajo construye y prueba las imágenes para las solicitudes de extracción, pero solo las publica para las confirmaciones en la rama main.tagsyannotationsutilizan las salidas de la acción de metadatos para aplicar automáticamente etiquetas y anotaciones coherentes a la imagen.
Atestaciones
El SBOM (Software Bill of Materials) y las atestaciones de procedencia mejoran la seguridad y la trazabilidad, asegurando que tus imágenes cumplan con los requisitos modernos de la cadena de suministro de software.
Con una pequeña cantidad de configuración adicional, puedes configurar
docker/build-push-action para generar la lista de materiales de software (SBOM) y
las atestaciones de procedencia para la imagen, en el momento de la construcción.
Para generar estos metadatos adicionales, debes realizar dos cambios en tu flujo de trabajo:
- Antes del paso de construcción, agrega un paso que use
docker/setup-buildx-action. Esta acción configura tu cliente de construcción de Docker con capacidades adicionales que el cliente predeterminado no admite. - Luego, actualiza el paso Build and push Docker image para habilitar también el SBOM y las atestaciones de procedencia.
Aquí está el fragmento actualizado:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
- name: Build and push Docker image
uses: docker/build-push-action@v7
with:
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
annotations: ${{ steps.meta.outputs.annotations }}
provenance: true
sbom: truePara más detalles sobre las atestaciones, consulta la documentación.
Conclusión
Con todos los pasos descritos en la sección anterior, aquí está la configuración completa del flujo de trabajo:
name: Build and Push Docker Image
on:
push:
branches:
- main
pull_request:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Extract Docker image metadata
id: meta
uses: docker/metadata-action@v6
with:
images: ${{ vars.DOCKER_USERNAME }}/my-image
- name: Log in to Docker Hub
uses: docker/login-action@v4
with:
username: ${{ vars.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
- name: Build and push Docker image
uses: docker/build-push-action@v7
with:
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
annotations: ${{ steps.meta.outputs.annotations }}
provenance: true
sbom: trueEste flujo de trabajo implementa las mejores prácticas para construir y publicar imágenes de Docker usando GitHub Actions. Esta configuración se puede utilizar tal como está o ampliarse con características adicionales basadas en las necesidades de tu proyecto, como multiplataforma.
Lectura adicional
- Obtén más información sobre configuraciones avanzadas y ejemplos en la sección GitHub Actions de Docker Build.
- Para configuraciones de construcción más complejas, es posible que desees considerar Bake. (Consulta también la guía Dominar Buildx Bake).
- Para conocer el servicio de construcción gestionado de Docker, diseñado para construcciones multiplataforma más rápidas, consulta Docker Build Cloud.