{"meta":{"title":"Publicación de imágenes de Docker","intro":"En este tutorial, aprenderá a publicar imágenes de Docker en un registro, como Docker Hub o GitHub Packages, como parte del flujo de trabajo de integración continua (CI).","product":"GitHub Actions","breadcrumbs":[{"href":"/es/actions","title":"GitHub Actions"},{"href":"/es/actions/tutorials","title":"Tutoriales"},{"href":"/es/actions/tutorials/publish-packages","title":"Publicar paquetes"},{"href":"/es/actions/tutorials/publish-packages/publish-docker-images","title":"Publicar imágenes de Docker"}],"documentType":"article"},"body":"# Publicación de imágenes de Docker\n\nEn este tutorial, aprenderá a publicar imágenes de Docker en un registro, como Docker Hub o GitHub Packages, como parte del flujo de trabajo de integración continua (CI).\n\n## Introducción\n\nEn esta guía se muestra cómo crear un flujo de trabajo que realice una compilación de Docker y, a continuación, publicar imágenes de Docker para Docker Hub o GitHub Packages. Con un solo flujo de trabajo, puedes publicar imágenes a un solo registro o a varios de ellos.\n\n> \\[!NOTE]\n> Si desea realizar un push a otro registro de Docker de terceros, el ejemplo de la sección [Publicar imágenes en GitHub Packages](#publishing-images-to-github-packages) sirve como buen modelo.\n\n## Requisitos previos\n\nRecomendamos que tengas un conocimiento básico de las opciones de configuración de flujo de trabajo y de cómo crear un archivo de flujo de trabajo. Para más información, consulta [Escritura de flujos de trabajo](/es/actions/learn-github-actions).\n\nTambién puede que encuentres útil el tener un entendimiento básico de lo siguiente:\n\n* [Uso de secretos en Acciones de GitHub](/es/actions/security-guides/using-secrets-in-github-actions)\n* [Uso de GITHUB\\_TOKEN para la autenticación en flujos de trabajo](/es/actions/security-guides/automatic-token-authentication)\n* [Trabajar con el registro de contenedores](/es/packages/working-with-a-github-packages-registry/working-with-the-container-registry)\n\n## Acerca de la configuración de imágenes\n\nEn esta guía se supone que tiene una definición completa para una imagen de Docker almacenada en un GitHub repositorio. Por ejemplo, su repositorio debe contener un *Dockerfile* y cualquier otro archivo que se necesite para realizar una compilación de Docker a fin de crear una imagen.\n\n```\n          Puedes usar etiquetas claves de anotación predefinidas para agregar metadatos, incluida una descripción, una licencia y un repositorio de origen a la imagen de contenedor. Para obtener más información, consulte [AUTOTITLE](/packages/working-with-a-github-packages-registry/working-with-the-container-registry#labelling-container-images).\n```\n\nEn esta guía, utilizaremos la acción `build-push-action` de Docker para compilar la imagen de Docker e insertarla en uno o varios registros de Docker. Para más información, vea [`build-push-action`](https://github.com/marketplace/actions/build-and-push-docker-images).\n\n## Publicación de imágenes en Docker Hub\n\n> \\[!NOTE]\n> Docker Hub normalmente impone límites de transferencia en las operaciones de inserción y extracción que afectarán a los trabajos en ejecutores autohospedados. Pero los ejecutores hospedados en GitHub no están sujetos a estos límites en función de un acuerdo entre GitHub y Docker.\n\nCada vez que cree una nueva versión en GitHub, puede desencadenar un flujo de trabajo para publicar la imagen. El flujo de trabajo del ejemplo siguiente se ejecuta cuando se desencadena el evento `release` con el tipo de actividad `published`.\n\nEn el flujo de trabajo de ejemplo siguiente, se usan las acciones de Docker `login-action` y `build-push-action` para compilar la imagen de Docker y, si la compilación se realiza correctamente, inserte la imagen compilada en Docker Hub.\n\nPara hacer push en Docker Hub, deberá tener una cuenta de Docker Hub y un repositorio creado en Docker Hub. Para obtener más información, consulte [Pushing a Docker container image to Docker Hub](https://docs.docker.com/docker-hub/quickstart/#step-3-build-and-push-an-image-to-docker-hub) en la documentación de Docker.\n\nLas opciones de `login-action` necesarias para Docker Hub son:\n\n* `username` y `password`: este es el nombre de usuario y la contraseña de Docker Hub. Se recomienda almacenar el nombre de usuario y la contraseña de Docker Hub como secretos para que no se expongan en el archivo de flujo de trabajo. Para más información, consulta [Uso de secretos en Acciones de GitHub](/es/actions/security-guides/using-secrets-in-github-actions).\n\nLa opción `metadata-action` necesaria para Docker Hub es:\n\n* `images`: El espacio de nombres y el nombre de la imagen de Docker que va a compilar o subir a Docker Hub.\n\nLas opciones de `build-push-action` necesarias para Docker Hub son:\n\n* `tags`: la etiqueta de la nueva imagen con el formato `DOCKER-HUB-NAMESPACE/DOCKER-HUB-REPOSITORY:VERSION`. Puedes configurar una etiqueta sencilla como se muestra a continuación o especificar etiquetas múltiples en una lista.\n* `push`: si se establece en `true`, la imagen se insertará en el registro si se ha compilado correctamente.\n\n```yaml copy\n# Este flujo de trabajo usa acciones que no GitHub no certifica.\n# Estas las proporcionan entidades terceras y las gobiernan\n# condiciones de servicio, políticas de privacidad y documentación de soporte\n# en línea.\n\n# GitHub recomienda anclar acciones a un SHA de confirmación.\n# Para obtener una versión más reciente, debes actualizar el SHA.\n# También puedes hacer referencia a una etiqueta o rama, pero la acción puede cambiar sin ninguna advertencia.\n\nname: Publish Docker image\n\non:\n  release:\n    types: [published]\n\njobs:\n  push_to_registry:\n    name: Push Docker image to Docker Hub\n    runs-on: ubuntu-latest\n    permissions:\n      packages: write\n      contents: read\n      attestations: write\n      id-token: write\n    steps:\n      - name: Check out the repo\n        uses: actions/checkout@v6\n\n      - name: Log in to Docker Hub\n        uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a\n        with:\n          username: ${{ secrets.DOCKER_USERNAME }}\n          password: ${{ secrets.DOCKER_PASSWORD }}\n\n      - name: Extract metadata (tags, labels) for Docker\n        id: meta\n        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7\n        with:\n          images: my-docker-hub-namespace/my-docker-hub-repository\n\n      - name: Build and push Docker image\n        id: push\n        uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671\n        with:\n          context: .\n          file: ./Dockerfile\n          push: true\n          tags: ${{ steps.meta.outputs.tags }}\n          labels: ${{ steps.meta.outputs.labels }}\n\n      - name: Generate artifact attestation\n        uses: actions/attest@v4\n        with:\n          subject-name: index.docker.io/my-docker-hub-namespace/my-docker-hub-repository\n          subject-digest: ${{ steps.push.outputs.digest }}\n          push-to-registry: true\n```\n\nEl flujo de trabajo anterior comprueba el repositorio GitHub, usa el `login-action` para iniciar sesión en el registro y, a continuación, usa la acción `build-push-action` para: compilar una imagen de Docker basada en la `Dockerfile` del repositorio; inserte la imagen en Docker Hub y aplique una etiqueta a la imagen.\n\nEn el último paso, genera una atestación de artefacto para la imagen, lo que aumenta la seguridad de la cadena de suministro. Para más información, consulta [Uso de atestaciones de artefactos para establecer la procedencia de las compilaciones](/es/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds).\n\n## Publicación de imágenes en GitHub Packages\n\nCada vez que cree una nueva versión en GitHub, puede desencadenar un flujo de trabajo para publicar la imagen. El flujo de trabajo del ejemplo siguiente se ejecuta cuando se inserta un cambio en la rama `release`.\n\nEn el flujo de trabajo de ejemplo siguiente, se usan las acciones de Docker `login-action`, `metadata-action`y`build-push-action` para compilar la imagen de Docker y, si la compilación se realiza correctamente, se inserta la imagen compilada en GitHub Packages.\n\nLas `login-action` opciones necesarias para GitHub Packages son:\n\n* `registry`: debe establecerse en `ghcr.io`.\n* `username`: puede usar el `${{ github.actor }}` contexto para usar automáticamente el nombre de usuario del usuario que desencadenó la ejecución del flujo de trabajo. Para más información, consulta [Contextos de referencia](/es/actions/learn-github-actions/contexts#github-context).\n* `password`: puede usar el secreto `GITHUB_TOKEN` generado automáticamente para la contraseña. Para más información, consulta [Uso de GITHUB\\_TOKEN para la autenticación en flujos de trabajo](/es/actions/security-guides/automatic-token-authentication).\n\nLa `metadata-action` opción necesaria para GitHub Packages es:\n\n* `images`: el espacio de nombres y el nombre de la imagen de Docker que está compilando.\n\nLas `build-push-action` opciones necesarias para GitHub Packages son:\n\n* `context`: define el contexto de la compilación como el conjunto de archivos ubicados en la ruta de acceso especificada.\n* `push`: si se establece en `true`, la imagen se insertará en el registro si se compila correctamente.\n* `tags` y `labels`: se rellenan mediante la salida de `metadata-action`.\n\n> \\[!NOTE]\n>\n> * Este flujo de trabajo usa acciones que no están certificadas por GitHub. Las proporciona un tercero y se rigen por los términos de servicio independientes, la directiva de privacidad y la documentación de soporte técnico.\n> * GitHub recomienda las acciones de anclaje a un SHA de confirmación. Para obtener una versión más reciente, debes actualizar el SHA. También puedes hacer referencia a una etiqueta o rama, pero la acción puede cambiar sin ninguna advertencia.\n\n```yaml annotate copy\n#\nname: Create and publish a Docker image\n\n# Configures this workflow to run every time a change is pushed to the branch called `release`.\non:\n  push:\n    branches: ['release']\n\n# Defines two custom environment variables for the workflow. These are used for the Container registry domain, and a name for the Docker image that this workflow builds.\nenv:\n  REGISTRY: ghcr.io\n  IMAGE_NAME: ${{ github.repository }}\n\n# There is a single job in this workflow. It's configured to run on the latest available version of Ubuntu.\njobs:\n  build-and-push-image:\n    runs-on: ubuntu-latest\n    # Sets the permissions granted to the `GITHUB_TOKEN` for the actions in this job.\n    permissions:\n      contents: read\n      packages: write\n      attestations: write\n      id-token: write\n      #\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v6\n      # Uses the `docker/login-action` action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here.\n      - name: Log in to the Container registry\n        uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1\n        with:\n          registry: ${{ env.REGISTRY }}\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n      # This step uses [docker/metadata-action](https://github.com/docker/metadata-action#about) to extract tags and labels that will be applied to the specified image. The `id` \"meta\" allows the output of this step to be referenced in a subsequent step. The `images` value provides the base name for the tags and labels.\n      - name: Extract metadata (tags, labels) for Docker\n        id: meta\n        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7\n        with:\n          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}\n      # This step uses the `docker/build-push-action` action to build the image, based on your repository's `Dockerfile`. If the build succeeds, it pushes the image to GitHub Packages.\n      # It uses the `context` parameter to define the build's context as the set of files located in the specified path. For more information, see [Usage](https://github.com/docker/build-push-action#usage) in the README of the `docker/build-push-action` repository.\n      # It uses the `tags` and `labels` parameters to tag and label the image with the output from the \"meta\" step.\n      - name: Build and push Docker image\n        id: push\n        uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4\n        with:\n          context: .\n          push: true\n          tags: ${{ steps.meta.outputs.tags }}\n          labels: ${{ steps.meta.outputs.labels }}\n      \n      # This step generates an artifact attestation for the image, which is an unforgeable statement about where and how it was built. It increases supply chain security for people who consume the image. For more information, see [Using artifact attestations to establish provenance for builds](/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds).\n      - name: Generate artifact attestation\n        uses: actions/attest@v4\n        with:\n          subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}}\n          subject-digest: ${{ steps.push.outputs.digest }}\n          push-to-registry: true\n      \n```\n\nEl flujo de trabajo anterior se activa mediante una subida a la rama \"release\". Comprueba el repositorio de GitHub y usa el `login-action` para iniciar sesión en el Container registry. Luego extrae las etiquetas y marcas de la imagen de Docker. Por último, usa la `build-push-action` acción para compilar la imagen y publicarla en .Container registry\n\n## Publicación de imágenes en Docker Hub y GitHub Packages\n\nEn un solo flujo de trabajo, puede publicar su imagen de Docker en varios registros mediante las acciones `login-action` y `build-push-action` para cada uno de ellos.\n\nEn el flujo de trabajo de ejemplo siguiente se usan los pasos de las secciones anteriores ([Publishing images to Docker Hub](#publishing-images-to-docker-hub) and [Publishing images to GitHub Packages](#publishing-images-to-github-packages)) para crear un único flujo de trabajo que inserte en ambos registros.\n\n```yaml copy\n# Este flujo de trabajo usa acciones que no GitHub no certifica.\n# Estas las proporcionan entidades terceras y las gobiernan\n# condiciones de servicio, políticas de privacidad y documentación de soporte\n# en línea.\n\n# GitHub recomienda anclar acciones a un SHA de confirmación.\n# Para obtener una versión más reciente, debes actualizar el SHA.\n# También puedes hacer referencia a una etiqueta o rama, pero la acción puede cambiar sin ninguna advertencia.\n\nname: Publish Docker image\n\non:\n  release:\n    types: [published]\n\njobs:\n  push_to_registries:\n    name: Push Docker image to multiple registries\n    runs-on: ubuntu-latest\n    permissions:\n      packages: write\n      contents: read\n    steps:\n      - name: Check out the repo\n        uses: actions/checkout@v6\n\n      - name: Log in to Docker Hub\n        uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a\n        with:\n          username: ${{ secrets.DOCKER_USERNAME }}\n          password: ${{ secrets.DOCKER_PASSWORD }}\n\n      - name: Log in to the Container registry\n        uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1\n        with:\n          registry: ghcr.io\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Extract metadata (tags, labels) for Docker\n        id: meta\n        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7\n        with:\n          images: |\n            my-docker-hub-namespace/my-docker-hub-repository\n            ghcr.io/${{ github.repository }}\n\n      - name: Build and push Docker images\n        id: push\n        uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671\n        with:\n          context: .\n          push: true\n          tags: ${{ steps.meta.outputs.tags }}\n          labels: ${{ steps.meta.outputs.labels }}\n```\n\nEl flujo de trabajo anterior verifica el repositorio GitHub, usa `login-action` para iniciar sesión en ambos registros y genera etiquetas y rótulos con la acción de `metadata-action`.\nA continuación, la acción `build-push-action` compila y sube la imagen de Docker a Docker Hub y Container registry.\n\n> \\[!NOTE]\n> Cuándo insertar en varios registros:\n>\n> * Los resúmenes de imagen pueden diferir entre los registros, lo que dificulta la comprobación de la atestación.\n> * Para mantener un resumen coherente y permitir que una única atestación compruebe todas las copias, inserte primero en un registro y use una herramienta como [`crane copy`](https://github.com/google/go-containerregistry/blob/main/cmd/crane/doc/crane_copy.md) para replicar la imagen en otro lugar.\n> * Si decide compilar y subir a cada registro por separado, debe generar una atestación distinta para cada uno para asegurarse de que los artefactos continúen siendo verificables.\n\n## Ejercicios prácticos\n\nPractique la publicación de imágenes de Docker con el ejercicio [Publicación de imágenes](https://github.com/skills/publish-docker-images)GitHub Skills de Docker.\n\nEn este ejercicio, aprenderá a:\n\n* Autentíquese en GitHub Packages mediante `GITHUB_TOKEN`.\n* Compile y publique imágenes de contenedor en Container registry (`ghcr.io`).\n* Use acciones oficiales de Docker, como `docker/login-action`, `docker/build-push-action`y `docker/setup-buildx-action`.\n* Genere etiquetas automáticamente con `docker/metadata-action` en función de ramas, solicitudes de incorporación de cambios y versiones.\n* Cree características, solicitudes de incorporación de cambios y versiones con el control de versiones de contenedor adecuado."}