Skip to main content

Como publicar imagens Docker do Node.js no registro do Docker Hub usando o GitHub Actions

Escrito por

9 de agosto de 2021

0 minutos de leitura

Em uma publicação anterior, apresentamos um tutorial passo a passo sobre como publicar imagens Docker do Node.js no registro do GitHub Packages usando o GitHub Actions. Nesta publicação, vamos mostrar como publicar no registro público do Docker Hub a imagem Docker que criamos.

Por que isso é útil, você deve estar se perguntando. O aplicativo de linha de comando do Docker, docker, usa docker.io como registro padrão, que aponta para o registro do Docker Hub. Isso facilita a experiência de desenvolvimento: você pode baixar imagens usando a convenção <user>/<repository>, como no exemplo abaixo, caso queira usar a CLI do Snyk como imagem Docker:

docker pull snyk/snyk-cli

Neste artigo, vamos percorrer um passo a passo para configurar outro fluxo de trabalho de criação e publicação de imagens Docker, que pode funcionar em paralelo ao fluxo que apresentamos anteriormente para o registro do GitHub Packages.

Assim como a publicação anterior, esta dá continuidade ao conteúdo sobre o Dockly, uma ferramenta de linha de comando de código aberto, escrita em Node.js, para gerenciar contêineres Docker pela CLI, e mostra como enviar uma imagem Docker para o Docker Hub. Você pode conferir o fluxo de trabalho final no repositório do Dockly no GitHub.

Criar um fluxo de trabalho do GitHub Actions

Para adicionar um novo fluxo de trabalho, basta criar um arquivo no diretório .github/workflows/ ou acessar seu repositório de código aberto no GitHub, clicar na aba Actions, depois em New Workflow e iniciar um novo fluxo de trabalho:

Página do GitHub Actions mostrando a lista de fluxos de trabalho, com “Docker: GitHub Packages” e um filtro “Todos os fluxos de trabalho”.

Escolha um nome para o arquivo do fluxo de publicação no Docker Hub, como docker-publish-to-dockerhub.yml.

Se você estiver fazendo isso pela interface do GitHub, talvez o arquivo do fluxo de trabalho já venha preenchido. Nesse caso, basta apagar o conteúdo e adicionar o seguinte:

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 }}

Detalhamos cada um desses pontos no artigo anterior, mas, para relembrar:

  • Esse fluxo de trabalho do Docker Hub será executado a cada push, lançamento de tag e pull request direcionados à branch principal do repositório.

  • As variáveis de ambiente globais definem REGISTRY como docker.io, ou seja, nossas imagens serão enviadas ao Docker Hub e ficarão disponíveis lá. Já IMAGE_NAME recebe o nome de usuário e o nome do repositório do GitHub. Se seu nome de usuário no Docker Hub for diferente, talvez seja necessário ajustar esse valor.

Em seguida, vamos definir os jobs, que estabelecerão o processo de criação da imagem Docker e, depois, de publicação.

Fazer login no Docker Hub e criar e publicar a imagem Docker

Em seguida, precisamos realizar as seguintes ações:

  1. Fazer login no Docker Hub. Para isso, precisamos criar um token no Docker Hub e configurá-lo como um segredo do repositório nas configurações do repositório do GitHub.

  2. Extrair os metadados da imagem Docker que criamos para que fiquem disponíveis durante o processo de criação da imagem.

  3. Enviar ao Docker Hub a imagem Docker criada.

O trecho de código abaixo configura essas etapas. Adicione-o ao conteúdo do fluxo de trabalho criado na etapa 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 }}

Depois de aplicar o arquivo do fluxo de trabalho e mesclá-lo à branch principal, você deverá obter uma criação bem-sucedida, que resultará no envio de uma nova imagem Docker ao registro do Docker Hub:

Notificação do GitHub Actions mostrando um novo job para publicar no Docker Hub na branch principal

Uma ressalva conhecida é que, por enquanto, o repositório do Docker Hub para o qual você publica a imagem não recebe automaticamente uma descrição adequada nem o conteúdo do README, porque isso não está disponível na GitHub Action oficial docker/build-and-push.

Se você quiser adicionar esse recurso, os mantenedores recomendam a GitHub Action do Marketplace Docker Hub Description e indicam um exemplo na documentação que você pode adotar.

Baixar imagens Docker do registro do Docker Hub

Para baixar a nova imagem Docker do Docker Hub, basta executar o conhecido comando docker pull , por exemplo:

$ 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

Você está enviando imagens Docker vulneráveis?

Por que parar por aqui? Com o Snyk, você pode encontrar, monitorar e até corrigir vulnerabilidades em imagens Docker. Escolha o fluxo de trabalho que melhor atende às suas necessidades: use a CLI ou importe imagens Docker diretamente do Docker Hub para monitorá-las em busca de vulnerabilidades de segurança.

Meu colega Eric Smalling escreveu um guia detalhado de práticas recomendadas sobre fluxos de trabalho orientados por desenvolvedores: análise de Dockerfiles e imagens, priorização e correção, caso você queira se aprofundar no assunto.Não deixe de conferir também a Snyk GitHub Action, que você pode usar no ecossistema do GitHub Actions para detectar vulnerabilidades de segurança em bibliotecas de código aberto e imagens de contêiner.

Aprofunde-se

Para conhecer mais práticas recomendadas para criar imagens Docker, sugiro estes conteúdos:

  1. 10 práticas recomendadas para conteinerizar aplicações web Node.js com Docker

  2. Docker para desenvolvedores Node.js: 5 coisas que você precisa saber para não comprometer sua segurança

Se você ainda não leu o artigo anterior e quer publicar imagens Docker no GitHub Packages, confira como publicar imagens Docker do Node.js no registro do GitHub Packages usando o GitHub Actions.

Segurança de contêineres que prioriza os desenvolvedores

O Snyk encontra e corrige automaticamente vulnerabilidades em imagens de contêiner e workloads do Kubernetes.