Skip to main content

Cómo publicar imágenes Docker de Node.js en el registro Docker Hub con GitHub Actions

Escrito por

9 de agosto de 2021

0 minutos de lectura

En una publicación anterior, presentamos un tutorial paso a paso sobre cómo publicar imágenes Docker de Node.js en el registro GitHub Packages con GitHub Actions. En esta publicación, nos enfocaremos en publicar en el registro público Docker Hub la imagen Docker que compilamos.

Quizás te preguntes por qué es útil. La aplicación de línea de comandos de Docker, docker, tiene una configuración predeterminada del registro para docker.io, que apunta al registro Docker Hub. Esto facilita la experiencia de desarrollo, ya que permite extraer imágenes con la convención <user>/<repository>, como en el siguiente ejemplo, si quisieras usar Snyk CLI como imagen Docker:

docker pull snyk/snyk-cli

En este artículo, veremos paso a paso cómo configurar otro flujo de trabajo para compilar y publicar una imagen Docker, que puede funcionar en paralelo con el flujo de trabajo anterior que presentamos para el registro GitHub Packages.

Al igual que la publicación anterior, esta continúa con Dockly, la herramienta de línea de comandos de Node.js de código abierto para administrar contenedores Docker desde la CLI, y muestra cómo subir una imagen Docker a Docker Hub. Puedes ver el flujo de trabajo final en el repositorio de GitHub de Dockly.

Crea un flujo de trabajo de GitHub Actions

Para agregar un nuevo flujo de trabajo, puedes crear un archivo en el directorio .github/workflows/ o ir a tu repositorio de código abierto en GitHub, hacer clic en la pestaña Actions y luego en New Workflow para iniciar un nuevo flujo de trabajo:

Página de GitHub Actions que muestra la lista de flujos de trabajo con «Docker: GitHub Packages» y un filtro «Todos los flujos de trabajo».

Elige el nombre del archivo del flujo de trabajo para publicar en Docker Hub, por ejemplo, docker-publish-to-dockerhub.yml.

Si lo haces desde la interfaz de GitHub, es posible que el archivo del flujo de trabajo ya tenga contenido. En ese caso, simplemente bórralo y agrega lo siguiente:

name: "Docker: Docker Hub"

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.

on:
  push:
    branches: [ main ]
    tags: [ 'v*.*.*' ]
  pull_request:
    branches: [ main ]

env:
  REGISTRY: docker.io
  IMAGE_NAME: ${{ github.repository }}

Describimos cada uno de estos aspectos en detalle en el artículo anterior, pero, a modo de resumen:

  • Este flujo de trabajo de Docker Hub se ejecutará cada vez que se haga un push, se publique una versión con etiquetas o se cree un pull request en la rama principal del repositorio.

  • Las variables de entorno globales definen REGISTRY como docker.io, lo que significa que nuestras imágenes se subirán a Docker Hub y estarán disponibles allí. También establecen IMAGE_NAME con el nombre de usuario de GitHub y el nombre del repositorio. Si tu nombre de usuario de Docker Hub es diferente, es posible que debas ajustar este valor.

A continuación, definiremos nuestros trabajos, en los que estableceremos el proceso para compilar la imagen Docker y luego publicarla.

Inicia sesión en Docker Hub y compila y publica la imagen Docker

A continuación, tendremos que realizar estas acciones:

  1. Iniciar sesión en Docker Hub. Para ello, tendremos que crear un token en Docker Hub y configurarlo como secreto del repositorio en la configuración del repositorio de GitHub.

  2. Extraer los metadatos de la imagen Docker que compilamos para que estén disponibles durante el proceso de compilación.

  3. Subir a Docker Hub la imagen Docker compilada.

Esto se configura con el siguiente fragmento de código, que debes agregar al contenido del flujo de trabajo creado en el paso anterior:

jobs:
  build_and_publish:

    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write

    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Log into registry ${{ env.REGISTRY }}
        if: github.event_name != 'pull_request'
        uses: docker/login-action@28218f9b04b4f3f62068d7b6ce6ca5b26e35336c
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Extract Docker metadata
        id: meta
        uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
          flavor: |
            latest=true
            prefix=
            suffix=

      - name: Build and push Docker image
        uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
        with:
          context: .
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

Una vez que hayas aplicado el archivo del flujo de trabajo y lo hayas integrado en la rama principal, deberías obtener una compilación exitosa que genere una nueva imagen Docker publicada en Docker Hub:

Notificación de GitHub Actions que muestra un nuevo trabajo para publicar en Docker Hub en la rama principal

Una limitación conocida es que, por ahora, el repositorio de Docker Hub en el que publicas la imagen no completa automáticamente una descripción adecuada ni el contenido del README, porque esta funcionalidad no está disponible en la GitHub Action oficial docker/build-and-push.

Si quieres contar con esta funcionalidad, los responsables del mantenimiento recomiendan la GitHub Action del marketplace Docker Hub Description y enlazan en su documentación a un ejemplo que puedes adoptar.

Extrae imágenes Docker del registro Docker Hub

Para obtener la nueva imagen Docker de Docker Hub, solo tienes que ejecutar el conocido comando docker pull , por ejemplo:

$ docker pull <user>/<repository>
Using default tag: latest
latest: Pulling from <user>/<repository>
b4d181a07f80: Pulling fs layer
de8ecf497b75: Pulling fs layer
69b92f9e5e70: Pulling fs layer
1f2b8e2c8ad8: Waiting
d0f4259cb643: Waiting
9ae47f3f99ba: Waiting
87270829eb60: Waiting
905fc634546c: Waiting

¿Estás subiendo imágenes Docker vulnerables?

¿Por qué detenerte aquí? Con Snyk puedes encontrar, monitorear e incluso corregir vulnerabilidades en imágenes Docker. Puedes adoptar el flujo de trabajo que mejor se adapte a tus necesidades: usar la CLI o importar imágenes Docker directamente desde Docker Hub para monitorearlas y detectar vulnerabilidades de seguridad.

Mi colega Eric Smalling escribió una guía detallada de mejores prácticas sobre Flujos de trabajo impulsados por desarrolladores: análisis de Dockerfile e imágenes, priorización y corrección, por si quieres profundizar tus conocimientos sobre este tema. Por último, puedes usar una Snyk GitHub Action en el ecosistema de GitHub Actions para analizar vulnerabilidades de seguridad en bibliotecas de código abierto e imágenes de contenedores.

Profundiza

Si quieres explorar más a fondo las mejores prácticas para compilar imágenes Docker, te recomiendo lo siguiente:

  1. 10 mejores prácticas para contenerizar aplicaciones web de Node.js con Docker

  2. Docker para desarrolladores de Node.js: 5 cosas que debes saber para proteger tu seguridad

Y si no leíste el artículo anterior y quieres publicar imágenes Docker en GitHub Packages, consulta cómo publicar imágenes Docker de Node.js en el registro GitHub Packages con GitHub Actions.

Seguridad de contenedores centrada en los desarrolladores

Snyk encuentra y corrige automáticamente vulnerabilidades en imágenes de contenedores y cargas de trabajo de Kubernetes.