Interagir com imagens do Docker Hub

Pode usar imagens de contentores do Docker Hub para executar as suas tarefas no Cloud Build. Além disso, se a sua compilação produzir imagens, pode enviá-las para o Docker Hub. Esta página descreve como escrever ficheiros de configuração de compilação para enviar e extrair imagens do Docker Hub. Para uma vista geral de todos os campos disponíveis num ficheiro de configuração de compilação, consulte o artigo Vista geral da configuração de compilação.

Extrair imagens públicas do Docker Hub

Pode extrair imagens oficiais do Docker, imagens certificadas pelo Docker e imagens personalizadas armazenadas no Docker Hub no passo de compilação especificando o nome da imagem no campo name. O Cloud Build extrai primeiro a imagem especificada do Docker Hub e, em seguida, usa a imagem para executar o passo de compilação.

No exemplo abaixo, o Cloud Build extrai a imagem do Docker para maven para executar o comando mvn especificado em args:

YAML

steps:
- name: "maven"
  args: ["mvn", "--version"]

JSON

{
   "steps": [
      {
         "name": "maven",
         "args": [
            "mvn",
            "--version"
         ]
      }
   ]
}

Armazenar credenciais do Docker no Secret Manager

Para extrair imagens privadas e enviar imagens públicas e privadas para o Docker Hub, o Cloud Build tem de fazer a autenticação no Docker com as suas credenciais. Para incluir credenciais do Docker nas suas compilações, tem de armazenar primeiro as credenciais no Secret Manager e, em seguida, conceder autorização ao Cloud Build para aceder ao segredo a partir do Secret Manager.

Para armazenar credenciais do Docker no Secret Manager:

  1. Aceda à página Secret Manager na Google Cloud consola:

    Aceda à página Secret Manager

  2. Na página Secret Manager, clique em Create Secret.

  3. Na página Criar segredo, em Nome, introduza docker-username.

  4. No campo Valor secreto, introduza o seu nome de utilizador do Docker.

  5. Não altere a secção Regiões.

  6. Clique no botão Criar segredo.

Repita os passos acima para armazenar a sua palavra-passe do Docker no Secret Manager.

Para conceder a função de IAM Secret Manager Secret Accessor ao segredo da conta de serviço que está a usar para a compilação:

  1. Abra a página Secret Manager na Google Cloud consola:

    Aceda à página Secret Manager

  2. Selecione a caixa de verificação do segredo correspondente ao seu nome de utilizador e palavra-passe do Docker.

  3. Se ainda não estiver aberto, clique em Mostrar painel de informações para o abrir.

  4. No painel, em Autorizações, clique em Adicionar principal.

  5. No campo Novos membros, introduza o endereço de email da sua conta de serviço.

  6. Na caixa de menu pendente Selecionar uma função, selecione a função Secret Manager Secret Accessor.

  7. Clique em Guardar.

Extrair imagens privadas do Docker Hub

Para extrair imagens privadas do Docker Hub:

  1. Certifique-se de que armazenou as suas credenciais do Docker no Secret Manager e concedeu autorizações ao Cloud Build para aceder ao segredo.

  2. No ficheiro de configuração de compilação:

    • Depois de toda a compilação steps, adicione um campo availableSecrets que especifique a versão secreta e a variável de ambiente para o nome de utilizador e a palavra-passe do Docker.
    • No passo de compilação onde quer especificar o nome de utilizador e a palavra-passe:
      • Adicione um campo entrypoint que aponte para bash para usar a ferramenta bash no passo de compilação. Isto é necessário para fazer referência à variável de ambiente do segredo.
      • Adicione um campo secretEnv que especifique a variável de ambiente para o nome de utilizador e a palavra-passe.
      • No campo args, adicione uma flag -c como o primeiro argumento. Qualquer string que passe após -c é tratada como um comando. Para mais informações sobre a execução de comandos bash com -c, consulte a documentação do bash.
      • Quando especificar o segredo no campo args, especifique-o através da variável de ambiente com o prefixo $$.

    The following build config file shows how to login to Docker using the Docker username and password stored in Secret Manager, and run a private image.

    YAML

     steps:
     - name: 'gcr.io/cloud-builders/docker'
       entrypoint: 'bash'
       args: ['-c', 'docker login --username=$$USERNAME --password=$$PASSWORD']
       secretEnv: ['USERNAME', 'PASSWORD']
     - name: "gcr.io/cloud-builders/docker"
       entrypoint: 'bash'
       args: ['-c', 'docker run $$USERNAME/REPOSITORY:TAG']
       secretEnv: ['USERNAME']
     availableSecrets:
       secretManager:
       - versionName: projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION
         env: 'PASSWORD'
       - versionName: projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION
         env: 'USERNAME'
    
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=$$USERNAME --password=$$PASSWORD"
        ],
        "secretEnv": [
          "USERNAME",
          "PASSWORD"
        ]
      },
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker run $$USERNAME/REPOSITORY:TAG"
         ],
         "secretEnv": [
          "USERNAME"
        ]
      }
      ],
      "availableSecrets": {
        "secretManager": [{
          "versionName": "projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION",
          "env": "PASSWORD"
      }, {
        "versionName": "projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION",
        "env": "USERNAME"
         }]
      }
    }
    

    Replace the placeholder values in the above commands with the following:

    • PROJECT_ID: The ID of the Google Cloud project where you've stored your secrets.
    • DOCKER_USERNAME_SECRET_NAME: The secret name corresponding to your Docker username.
    • DOCKER_USERNAME_SECRET_VERSION: The secret version of your Docker username.
    • DOCKER_PASSWORD_SECRET_NAME: The secret name corresponding to your Docker password.
    • DOCKER_PASSWORD_SECRET_VERSION: The secret version of your Docker password.
    • REPOSITORY: The name of your Docker repository from where you're pulling the image.
    • TAG: The tag name of your image.
  3. Use the build config file to manually start a build or to automate builds using triggers.

Pushing images to Docker Hub

To push public and private images to Docker Hub:

  1. Make sure you've stored your Docker credentials in Secret Manager and granted permissions for Cloud Build to access the secret.

  2. In the build config file:

    • After all the build steps, add an availableSecrets field specifying the secret version and the env variable for the Docker username and password.
    • In the build step where you want to specify the username and password:
      • Add an entrypoint field pointing to bash to use the bash tool in the build step. This is required to refer to the environment variable for the secret.
      • Add a secretEnv field specifying the environment variable for username and password.
      • In the args field, add a -c flag as the first argument. Any string you pass after -c is treated as a command. For more information on running bash commands with -c, see the bash documentation.
      • When specifying the secret in the args field, specify it using the environment variable prefixed with $$.

    The following example build config file shows how to login to Docker, build an image with source code stored locally, and then push the image to Docker repository.

    YAML

     steps:
     - name: 'gcr.io/cloud-builders/docker'
       entrypoint: 'bash'
       args: ['-c', 'docker login --username=$$USERNAME --password=$$PASSWORD']
       secretEnv: ['USERNAME', 'PASSWORD']
     - name: 'gcr.io/cloud-builders/docker'
       entrypoint: 'bash'
       args: ['-c', 'docker build -t $$USERNAME/REPOSITORY:TAG .']
       secretEnv: ['USERNAME']
     - name: 'gcr.io/cloud-builders/docker'
       entrypoint: 'bash'
       args: ['-c', 'docker push $$USERNAME/REPOSITORY:TAG']
       secretEnv: ['USERNAME']
     availableSecrets:
       secretManager:
       - versionName: projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION
         env: 'PASSWORD'
       - versionName: projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION
         env: 'USERNAME'
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=$$USERNAME --password=$$PASSWORD"
        ],
        "secretEnv": [
          "USERNAME",
          "PASSWORD"
        ]
      },
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker build -t $$USERNAME/REPOSITORY:TAG ."
         ],
         "secretEnv": [
          "USERNAME"
        ]
      },
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker push $$USERNAME/REPOSITORY:TAG"
         ],
         "secretEnv": [
          "USERNAME"
        ]
      }
      ],
      "availableSecrets": {
        "secretManager": [{
          "versionName": "projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION",
          "env": "PASSWORD"
      }, {
        "versionName": "projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION",
        "env": "USERNAME"
         }]
      }
    }
    

    Substitua os valores dos marcadores de posição nos comandos acima pelo seguinte:

    • PROJECT_ID: o ID do Google Cloud projeto onde armazenou os seus segredos.
    • DOCKER_USERNAME_SECRET_NAME: o nome secreto correspondente ao seu nome de utilizador do Docker.
    • DOCKER_USERNAME_SECRET_VERSION: a versão secreta do seu nome de utilizador do Docker.
    • DOCKER_PASSWORD_SECRET_NAME: o nome secreto correspondente à sua palavra-passe do Docker.
    • DOCKER_PASSWORD_SECRET_VERSION: a versão secreta da sua palavra-passe do Docker.
    • REPOSITORY: o nome do seu repositório do Docker para o qual está a enviar a imagem.
    • TAG: o nome da etiqueta da imagem.
  3. Use o ficheiro de configuração de compilação para iniciar manualmente uma compilação ou para automatizar compilações através de acionadores.

Trabalhar com versões do cliente Docker

O criador do Docker suportado para o Cloud Build gcr.io/cloud-builders/docker usa o Docker 20.10.14. Com esta versão, se não especificar uma etiqueta ao enviar uma imagem para o Docker, o Docker envia apenas a imagem com a etiqueta latest. Se a etiqueta latest não existir, o envio falha.

Para enviar uma imagem com uma etiqueta específica para o Docker, especifique a etiqueta no passo de compilação.docker push O exemplo seguinte envia uma imagem etiquetada como prod:

YAML

steps:
...
- name: 'gcr.io/cloud-builders/docker'
  args: ['docker', 'push', '$$USERNAME/myrepo:prod']
...

JSON

{
  ...
  {
    "name": "gcr.io/cloud-builders/docker",
    "args": [
      "docker",
      "push", 
      "$$USERNAME/myrepo:prod"
      ],
  }
  ...
}

Para enviar todas as etiquetas de uma imagem para o Docker, adicione a flag -a à lista de argumentos no passo de compilação docker push:

YAML

steps:
...
- name: 'gcr.io/cloud-builders/docker'
  args: ['docker', 'push', '-a', '$$USERNAME/myrepo']
...

JSON

{
  ...
  {
    "name": "gcr.io/cloud-builders/docker",
    "args": [
      "docker",
      "push",
      "-a",
      "$$USERNAME/myrepo"
      ],
  }
  ...
}

Pode usar o cliente Docker 19.03.9 etiquetando a versão no criador do Docker:

YAML

steps:
...
- name: 'gcr.io/cloud-builders/docker:19.03.9'
  args: ['docker', 'push', '$$USERNAME/myrepo:prod']
...

JSON

{
  ...
  {
    "name": "gcr.io/cloud-builders/docker:19.03.9",
    "args": [
      "docker",
      "push",
      "$$USERNAME/myrepo:prod"
      ],
  }
  ...
}

O que se segue?