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 "Aprenda o GitHub Actions".
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.
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 AE, 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 created
. Para saber mais sobre o evento release
, confira "Eventos que disparam fluxos de trabalho".
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
epassword
: 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 "Segredos criptografados".
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 formatoDOCKER-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 comotrue
, a imagem será enviada por push para o registro se for compilada com sucesso.
# 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
steps:
- name: Check out the repo
uses: actions/checkout@v3
- 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
uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
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.
Publicar imagens em GitHub Packages
Cada vez que criar uma nova versão no GitHub AE, 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 created
. Para saber mais sobre o evento release
, confira "Eventos que disparam fluxos de trabalho".
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, 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 comodocker.pkg.github.com
.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 "Contextos".password
: use o segredoGITHUB_TOKEN
gerado automaticamente para a senha. Para obter mais informações, confira "Autenticação automática de token".
As opções build-push-action
obrigatórias para o GitHub Packages são:
-
push
: se isso for definido comotrue
, a imagem será enviada por push para o registro se for compilada com sucesso. -
tags
: deve ser definido no formatodocker.pkg.github.com/OWNER/REPOSITORY/IMAGE_NAME:VERSION
.Por exemplo, para uma imagem chamada
octo-image
armazenada no GitHub emhttp://github.com/octo-org/octo-repo
, a opçãotags
deve ser definida comodocker.pkg.github.com/octo-org/octo-repo/octo-image:latest
. Você pode definir uma única tag, conforme mostrado abaixo, ou especificar várias tags em uma lista.
# 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 GitHub Packages
runs-on: ubuntu-latest
permissions:
packages: write
contents: read
steps:
- name: Check out the repo
uses: actions/checkout@v3
- name: Log in to GitHub Docker Registry
uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
with:
registry: docker.YOUR-HOSTNAME.com
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push Docker image
uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
with:
context: .
push: true
tags: |
docker.YOUR-HOSTNAME.com/${{ github.repository }}/octo-image:${{ github.sha }}
docker.YOUR-HOSTNAME.com/${{ github.repository }}/octo-image:${{ github.event.release.tag_name }}
O fluxo de trabalho acima faz check-out do repositório do GitHub AE, 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 repositório, enviar por push a imagem para o registro do Docker e aplicar a confirmação do SHA e a versão como marcas da imagem.
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.
# 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
steps:
- name: Check out the repo
uses: actions/checkout@v3
- 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 Docker registry
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
with:
registry: docker.YOUR-HOSTNAME.com
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
docker.YOUR-HOSTNAME.com/${{ github.repository }}/my-image
- name: Build and push Docker images
uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
O fluxo de trabalho acima faz check-out do repositório do GitHub AE, 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 a envia por push para o Docker Hub e o Registro do Docker.