Skip to main content

Publicando imagens do Docker

Você pode publicar imagens Docker para um registro, como o Docker Hub ou GitHub Packages, como parte do seu fluxo de trabalho de integração contínua (CI).

Introdução

Este guia mostra como criar um fluxo de trabalho que realiza uma criação do Docker e, em seguida, publica imagens do Docker no Docker Hub ou no GitHub Packages. Com um único fluxo de trabalho, você pode publicar imagens em um único registro ou em vários registros.

Observação: caso você deseje efetuar push para outro registro do Docker de terceiros, o exemplo descrito na seção "Como publicar imagens no GitHub Packages" pode servir como um bom modelo.

Pré-requisitos

Recomendamos que você tenha um entendimento básico das opções de configuração do fluxo de trabalho e de como criar um arquivo do fluxo de trabalho. Para obter mais informações, confira "Escrevendo fluxos de trabalho".

Você também pode achar útil ter um entendimento básico do seguinte:

Sobre a configuração da imagem

Este guia pressupõe que você tem uma definição completa para uma imagem Docker armazenada em um repositório GitHub. Por exemplo, seu repositório precisa conter um Dockerfile e todos os outros arquivos necessários para executar um build do Docker para criar uma imagem.

Você pode usar chaves de anotação pré-definidas para adicionar metadados, incluindo uma descrição, uma licença e um repositório de origem à imagem de contêiner. Para saber mais, confira "Trabalhando com o registro do Contêiner".

Neste guia, usaremos a ação build-push-action do Docker para compilar a imagem do Docker e efetuar push dela para um ou mais registros do Docker. Para obter mais informações, confira build-push-action.

Publicar imagens no Docker Hub

Cada vez que criar uma nova versão no GitHub Enterprise Cloud, você poderá acionar um fluxo de trabalho para publicar a imagem. O fluxo de trabalho no exemplo abaixo é executado quando o evento release é disparado com o tipo de atividade published.

No exemplo de fluxo de trabalho abaixo, usaremos as ações login-action e build-push-action do Docker para compilar a imagem do Docker e, se o build for bem-sucedido, efetuaremos push da imagem compilada para o Docker Hub.

Para fazer push para o Docker Hub, você deverá ter uma conta Docker Hub e ter criado um repositório Docker Hub. Para obter mais informações, confira "Como efetuar push de uma imagem de contêiner do Docker para o Docker Hub" na documentação do Docker.

As opções login-action necessárias para o Docker Hub são:

  • username e password: esse é seu nome de usuário e sua senha do Docker Hub. Recomendamos armazenar seu nome de usuário e senha do Docker Hub como segredos para que não estejam expostos no seu arquivo de fluxo de trabalho. Para obter mais informações, confira "Usar segredos em ações do GitHub".

A opção metadata-action obrigatória para o Docker Hub é:

  • images: o namespace e o nome da imagem do Docker que você está compilando/enviando por push para o Docker Hub.

As opções build-push-action necessárias para o Docker Hub são:

  • tags: a marca da nova imagem no formato DOCKER-HUB-NAMESPACE/DOCKER-HUB-REPOSITORY:VERSION. Você pode definir uma única tag, conforme mostrado abaixo, ou especificar várias tags em uma lista.
  • push: se isso for definido como true, a imagem será enviada por push para o registro se for compilada com sucesso.
YAML
# Esse fluxo de trabalho usa ações que não são certificadas pelo GitHub.
# São fornecidas por terceiros e regidas por
# termos de serviço, política de privacidade e suporte separados
# online.

# O GitHub recomenda fixar ações em um SHA de commit.
# Para obter uma versão mais recente, você precisará atualizar o SHA.
# Você também pode fazer referência a uma marca ou branch, mas a ação pode ser alterada sem aviso.

name: Publish Docker image

on:
  release:
    types: [published]

jobs:
  push_to_registry:
    name: Push Docker image to Docker Hub
    runs-on: ubuntu-latest
    permissions:
      packages: write
      contents: read
      attestations: write
      id-token: write
    steps:
      - name: Check out the repo
        uses: actions/checkout@v4

      - name: Log in to Docker Hub
        uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
        with:
          images: my-docker-hub-namespace/my-docker-hub-repository

      - name: Build and push Docker image
        id: push
        uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
        with:
          context: .
          file: ./Dockerfile
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

      - name: Generate artifact attestation
        uses: actions/attest-build-provenance@v1
        with:
          subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}}
          subject-digest: ${{ steps.push.outputs.digest }}
          push-to-registry: true

O fluxo de trabalho acima faz check-out do repositório do GitHub, usa login-action para fazer logon no registro e usa a ação build-push-action para: compilar uma imagem do Docker com base no Dockerfile do seu repositório, efetuar push da imagem para o Docker Hub e aplicar uma marca à imagem.

Na última etapa, gera um atestado de artefato para a imagem, o que aumenta a segurança da cadeia de fornecedores. Para obter mais informações, confira "Usar atestados de artefatos para estabelecer a procedência de compilações".

Publicar imagens em GitHub Packages

Cada vez que criar uma nova versão no GitHub Enterprise Cloud, você poderá acionar um fluxo de trabalho para publicar a imagem. O fluxo de trabalho no exemplo abaixo é executado quando uma alteração é enviada por push para o branch release.

No exemplo de fluxo de trabalho abaixo, usaremos as ações login-action, metadata-action e build-push-action do Docker para compilar a imagem do Docker e, se o build for bem-sucedido, efetuar push da imagem compilada para o GitHub Packages.

As opções login-action obrigatórias para o GitHub Packages são:

  • registry: deve ser definido como ghcr.io.
  • username: use o contexto ${{ github.actor }} para usar automaticamente o nome de usuário do usuário que disparou a execução de fluxo de trabalho. Para obter mais informações, confira "Accessing contextual information about workflow runs".
  • password: use o segredo GITHUB_TOKEN gerado automaticamente para a senha. Para obter mais informações, confira "Autenticação automática de token".

A opção metadata-action obrigatória para o GitHub Packages é:

  • images: o namespace e o nome da imagem do Docker que está sendo compilada.

As opções build-push-action obrigatórias para o GitHub Packages são:

  • context: define o contexto do build como o conjunto de arquivos localizado no caminho especificado.
  • push: se isso for definido como true, a imagem será enviada por push para o registro se for compilada com sucesso.
  • tags e labels: são preenchidos pela saída de metadata-action.

Observações:

  • Esse fluxo de trabalho usa ações que não são certificadas por GitHub. Elas são fornecidas por terceiros e regidar por termos de serviço, política de privacidade e documentação de suporte separados.
  • GitHub recomenda fixar ações em um SHA de confirmação. Para obter uma versão mais recente, você precisará atualizar o SHA. Você também pode fazer referência a uma marca ou branch, mas a ação pode ser alterada sem aviso.
YAML
name: Create and publish a Docker image
on:
  push:
    branches: ['release']

Configures this workflow to run every time a change is pushed to the branch called release.

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

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.

jobs:
  build-and-push-image:
    runs-on: ubuntu-latest

There is a single job in this workflow. It's configured to run on the latest available version of Ubuntu.

    permissions:
      contents: read
      packages: write
      attestations: write
      id-token: write

Sets the permissions granted to the GITHUB_TOKEN for the actions in this job.

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      - name: Log in to the Container registry
        uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

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.

      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}

This step uses docker/metadata-action 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.

      - name: Build and push Docker image
        id: push
        uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

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. 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" in the README of the docker/build-push-action repository. It uses the tags and labels parameters to tag and label the image with the output from the "meta" step.

      - name: Generate artifact attestation
        uses: actions/attest-build-provenance@v1
        with:
          subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}}
          subject-digest: ${{ steps.push.outputs.digest }}
          push-to-registry: true

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 "Usar atestados de artefatos para estabelecer a procedência de compilações."

#
name: Create and publish a Docker image

# Configures this workflow to run every time a change is pushed to the branch called `release`.
on:
  push:
    branches: ['release']

# 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.
env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

# There is a single job in this workflow. It's configured to run on the latest available version of Ubuntu.
jobs:
  build-and-push-image:
    runs-on: ubuntu-latest
    # Sets the permissions granted to the `GITHUB_TOKEN` for the actions in this job.
    permissions:
      contents: read
      packages: write
      attestations: write
      id-token: write
      # 
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      # 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.
      - name: Log in to the Container registry
        uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      # 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.
      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
      # 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.
      # 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.
      # It uses the `tags` and `labels` parameters to tag and label the image with the output from the "meta" step.
      - name: Build and push Docker image
        id: push
        uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
      
      # 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 "[AUTOTITLE](/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds)." 
      - name: Generate artifact attestation
        uses: actions/attest-build-provenance@v1
        with:
          subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}}
          subject-digest: ${{ steps.push.outputs.digest }}
          push-to-registry: true
      

O fluxo de trabalho acima é acionado por um push para o branch da "versão". Ele faz check-out do repositório do GitHub e usa login-action para fazer logon no Container registry. Em seguida, extrai etiquetas e tags para a imagem do Docker. Por fim, ele usa a ação build-push-action para criar a imagem e publicá-la no Container registry.

Publicar imagens no Docker Hub e GitHub Packages

Em um fluxo de trabalho individual, você pode publicar sua imagem do Docker em vários registros usando as ações login-action e build-push-action para cada registro.

O exemplo de fluxo de trabalho a seguir usa as etapas das seções anteriores ("Como publicar imagens no Docker Hub" e "Como publicar imagens no GitHub Packages") para criar um fluxo de trabalho individual que efetua push para os dois registros.

YAML
# Esse fluxo de trabalho usa ações que não são certificadas pelo GitHub.
# São fornecidas por terceiros e regidas por
# termos de serviço, política de privacidade e suporte separados
# online.

# O GitHub recomenda fixar ações em um SHA de commit.
# Para obter uma versão mais recente, você precisará atualizar o SHA.
# Você também pode fazer referência a uma marca ou branch, mas a ação pode ser alterada sem aviso.

name: Publish Docker image

on:
  release:
    types: [published]

jobs:
  push_to_registries:
    name: Push Docker image to multiple registries
    runs-on: ubuntu-latest
    permissions:
      packages: write
      contents: read
      attestations: write
      id-token: write
    steps:
      - name: Check out the repo
        uses: actions/checkout@v4

      - name: Log in to Docker Hub
        uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Log in to the Container registry
        uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
        with:
          images: |
            my-docker-hub-namespace/my-docker-hub-repository
            ghcr.io/${{ github.repository }}

      - name: Build and push Docker images
        id: push
        uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

      - name: Generate artifact attestation
        uses: actions/attest-build-provenance@v1
        with:
          subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}}
          subject-digest: ${{ steps.push.outputs.digest }}
          push-to-registry: true

O fluxo de trabalho acima faz check-out do repositório do GitHub Enterprise Cloud, usa a login-action duas vezes para fazer logon nos dois registros e gera marcas e rótulos com a ação metadata-action. Em seguida, a ação build-push-action compila a imagem do Docker e efetua push dela para o Docker Hub e o Container registry.

Na última etapa, gera um atestado de artefato para a imagem, o que aumenta a segurança da cadeia de fornecedores. Para obter mais informações, confira "Usar atestados de artefatos para estabelecer a procedência de compilações".