Empurre e puxe imagens

Esta página descreve o envio e a obtenção de imagens de contentores com o Docker. Também fornece informações sobre como extrair imagens com a ferramenta crictl se estiver a resolver problemas no Google Kubernetes Engine.

Para obter informações sobre a implementação em Google Cloud ambientes de tempo de execução, consulte Implemente em Google Cloud.

Para ver instruções sobre como listar, etiquetar e eliminar imagens, consulte o artigo Gerir imagens.

Antes de começar

  1. Se o repositório de destino não existir, crie um novo repositório.
  2. Tem de ter, pelo menos, acesso de escritor do Artifact Registry ao repositório.
  3. Instale o Docker se ainda não estiver instalado.

Funções necessárias

Para receber as autorizações de que precisa para enviar e extrair imagens, peça ao seu administrador que lhe conceda as seguintes funções de IAM no repositório:

Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

Também pode conseguir as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.

Autenticação num repositório

Tem de autenticar-se nos repositórios sempre que usar o Docker ou outro cliente de terceiros com um repositório Docker. Esta secção fornece um resumo rápido do que precisa para se autenticar com êxito. Para ver instruções detalhadas, consulte o artigo Configurar a autenticação para o Docker.

Usar um auxiliar de credenciais

Para o auxiliar de credenciais da CLI gcloud ou o auxiliar de credenciais autónomo, os hosts do Artifact Registry que usa têm de estar no seu ficheiro de configuração do Docker.

O Artifact Registry não adiciona automaticamente todos os anfitriões do registo ao ficheiro de configuração do Docker. O tempo de resposta do Docker é significativamente mais lento quando existe um grande número de registos configurados. Para minimizar o número de registos no ficheiro de configuração, adicione os anfitriões de que precisa ao ficheiro.

Para confirmar que anfitriões estão configurados, execute o seguinte comando para apresentar o conteúdo do ficheiro de configuração:

  • Linux: cat ~/.docker/config.json
  • Windows: type %USERPROFILE%\.docker\config.json

A secção credHelpers apresenta os anfitriões Docker do Artifact Registry configurados. Os nomes de anfitriões terminam em -docker.pkg.dev. O exemplo seguinte mostra alguns anfitriões configurados para o auxiliar de credenciais da CLI gcloud.

"credHelpers": {
  "asia.gcr.io": "gcloud",
  "eu.gcr.io": "gcloud",
  "gcr.io": "gcloud",
  "marketplace.gcr.io": "gcloud",
  "northamerica-northeast1-docker.pkg.dev": "gcloud",
  "us-central1-docker.pkg.dev": "gcloud",
  "us-east1-docker.pkg.dev": "gcloud",
  "us.gcr.io": "gcloud"
}

Se um anfitrião que quer usar não estiver na lista, execute novamente o auxiliar de credenciais para adicionar o anfitrião. Por exemplo, o seguinte comando adiciona us-west1-docker.pkg.dev.

  • Assistente de credenciais da CLI gcloud:

    gcloud auth configure-docker us-west1-docker.pkg.dev
    
  • Assistente de credenciais autónomo

    docker-credential-gcr configure-docker us-west1-docker.pkg.dev
    

Usar um token de acesso

Para a autenticação por token de acesso, gera um token e usa-o como palavra-passe com o comando docker login. Os tokens são válidos durante 60 minutos, pelo que deve autenticar-se pouco antes de etiquetar, enviar ou extrair imagens.

O exemplo seguinte gera uma chave de acesso através da representação da conta de serviço e, em seguida, faz a autenticação no Artifact Registry. Tem de ter autorizações na função criador de tokens de contas de serviço (roles/iam.serviceAccountTokenCreator) para gerar um token desta forma.

Linux

gcloud auth print-access-token \
  --impersonate-service-account  ACCOUNT | docker login \
  -u oauth2accesstoken \
  --password-stdin https://LOCATION-docker.pkg.dev

Windows

gcloud auth print-access-token \
--impersonate-service-account  ACCOUNT

ya29.8QEQIfY_...

docker login -u oauth2accesstoken -p "ya29.8QEQIfY_..." \
https://LOCATION-docker.pkg.dev

Se não tiver autorizações para se fazer passar por uma conta de serviço, pode ativar a conta de serviço na sua sessão da CLI gcloud e, em seguida, obter um token. Para ver detalhes, consulte as instruções para configurar a autenticação do token de acesso.

Usar uma chave de conta de serviço

Para uma chave de conta de serviço, usa a chave como palavra-passe com o comando docker login.

Por exemplo, o comando seguinte usa a chave da conta de serviço codificada em base64 no ficheiro key.json para fazer a autenticação no us-west1-docker.pkg.dev.

Linux

cat key.json | docker login -u _json_key_base64 --password-stdin \
https://us-west1-docker.pkg.dev

Windows

docker login -u _json_key_base64 --password-stdin https://us-west1-docker.pkg.dev < key.json

Para ver detalhes, consulte as instruções para configurar a autenticação da chave da conta de serviço.

Enviar uma imagem

Modos de repositório: padrão

Para enviar uma imagem local para um repositório Docker padrão, etiquete-a com o nome do repositório e, em seguida, envie a imagem.

Se o repositório Docker do Artifact Registry tiver a imutabilidade de etiquetas ativada, uma etiqueta tem sempre de fazer referência ao mesmo resumo da imagem no repositório. Não pode usar a etiqueta noutra versão da mesma imagem que envia para o repositório. Para mais informações sobre resumos de imagens, etiquetas e imutabilidade de etiquetas, consulte o artigo Versões de imagens de contentores.

Para imagens grandes, aplicam-se os seguintes limites:

Hora de carregamento
Se fizer a autenticação no Artifact Registry através de um token de acesso, o token só é válido durante 60 minutos. Se prevê que o tempo de carregamento vai exceder os 60 minutos, use um método de autenticação diferente.
Tamanho da imagem
O tamanho máximo do artefacto é de 5 TB.
O Artifact Registry não suporta carregamentos segmentados do Docker. Algumas ferramentas suportam o carregamento de imagens grandes com carregamentos segmentados ou um único carregamento monolítico. Tem de usar carregamentos monolíticos para enviar imagens para o Artifact Registry.

Etiquetar a imagem local

  1. Certifique-se de que está autenticado no repositório.

  2. Determine o nome da imagem. O formato de um nome de imagem completo é:

    LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE
    

    Substitua os seguintes valores:

    Por exemplo, considere uma imagem com as seguintes características:

    • Localização do repositório: us-west1
    • Nome do repositório: my-repo
    • ID do projeto: my-project
    • Nome da imagem local: my-image
    • Nome da imagem alvo: test-image

    O nome desta imagem para este exemplo é:

    us-west1-docker.pkg.dev/my-project/my-repo/test-image
    

    Para ver detalhes sobre o formato do nome da imagem, incluindo o processamento de projetos com âmbito de domínio, consulte o artigo Nomes de repositórios e imagens.

  3. Etiquete a imagem local com o nome do repositório.

    docker tag SOURCE-IMAGE LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE:TAG
    

    Substitua SOURCE-IMAGE pelo nome da imagem local ou pelo ID da imagem e TAG pela etiqueta. Se não especificar uma etiqueta, o Docker aplica a etiqueta latest predefinida.

    Se a definição de etiquetas de imagem imutáveis estiver ativada, as etiquetas têm de ser exclusivas para cada versão da imagem, incluindo a etiqueta latest. Não pode enviar uma imagem para o repositório se a etiqueta já for usada por outra versão da mesma imagem no repositório. Para verificar se a definição está ativada para o repositório, execute o comando:

    gcloud artifacts repositories describe REPOSITORY \
        --project=PROJECT-ID \
        --location=LOCATION
    

    Para a imagem de exemplo do passo anterior, usaria o seguinte comando se a imagem local my-image estiver no diretório atual:

    docker tag my-image us-west1-docker.pkg.dev/my-project/my-repo/test-image
    

    Se quiser aplicar uma etiqueta específica, use o comando:

    docker tag SOURCE-IMAGE LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE:TAG
    

    Para usar a etiqueta staging com a imagem de exemplo, adicione :staging ao comando:

    docker tag my-image us-west1-docker.pkg.dev/my-project/my-repo/test-image:staging
    

Envie a imagem etiquetada para o Artifact Registry

  1. Certifique-se de que está autenticado no repositório.

    Se usou gcloud auth configure-docker ou docker-credential-gcr configure-docker para configurar o seu cliente Docker, verifique se o nome de anfitrião de destino está no seu ficheiro de configuração do Docker.

  2. Envie a imagem etiquetada com o comando:

    docker push LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE
    

    Este comando envia a imagem com a etiqueta latest. Se quiser enviar uma imagem com uma etiqueta diferente, use o comando:

    docker push LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE:TAG
    

Quando envia uma imagem, esta é armazenada no repositório especificado.

Depois de enviar a imagem, pode:

  • Aceda à Google Cloud consola para ver a imagem.

  • Execute o comando gcloud para ver as etiquetas da imagem e o resumo gerado automaticamente:

    gcloud artifacts docker images list \
    LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE [--include-tags]
    

    O exemplo de saída seguinte mostra resumos de imagens truncados, mas o comando devolve sempre o resumo de imagem completo.

     IMAGE                                                 DIGEST         CREATE_TIME          UPDATE_TIME
      us-west1-docker.pkg.dev/my-project/my-repo/my-image  sha256:85f...  2019-04-10T15:08:45  2019-04-10T15:08:45
      us-west1-docker.pkg.dev/my-project/my-repo/my-image  sha256:238...  2019-04-10T17:23:53  2019-04-10T17:23:53
      us-west1-docker.pkg.dev/my-project/my-repo/my-image  sha256:85f...  2019-04-10T15:08:46  2019-04-10T15:08:46
    

Extrair imagens com o Docker

Modos de repositório: padrão, remoto, virtual
  1. Certifique-se de que está autenticado no repositório.

    Se usou gcloud auth configure-docker ou docker-credential-gcr configure-docker para configurar o seu cliente Docker, verifique se o nome de anfitrião de destino está no seu ficheiro de configuração do Docker.

  2. Para extrair de um repositório, use o comando:

    docker pull LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE:TAG
    

    ou

    docker pull LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE@IMAGE-DIGEST
    

    Substitua os seguintes valores:

    • LOCATION é a localização regional ou multirregional do repositório onde a imagem está armazenada.
    • PROJECT é o Google Cloud ID do projeto da consola. Se o ID do projeto contiver dois pontos (:), consulte o artigo Projetos com âmbito de domínio.
    • PROJECT é o Google Cloud ID do projeto da consola.
    • REPOSITORY é o nome do repositório onde a imagem está armazenada.
    • IMAGE é o nome da imagem no repositório.
    • TAG é a etiqueta da versão da imagem que quer obter.
    • IMAGE-DIGEST é o valor hash sha256 do conteúdo da imagem. Cada versão de uma imagem tem um resumo da imagem exclusivo. Na Google Cloud consola, clique na imagem específica para ver os respetivos metadados. O resumo é apresentado como o Resumo da imagem.

    Por exemplo, considere uma imagem com as seguintes características:

    • Localização do repositório: us-west1
    • Nome do repositório: my-repo
    • ID do projeto: my-project
    • Nome da imagem: test-image
    • Etiqueta: staging

    Este comando para extrair a imagem é:

    docker pull us-west1-docker.pkg.dev/my-project/my-repo/test-image:staging
    

O Docker transfere a imagem especificada.

Se pedir uma imagem de um repositório remoto, o repositório remoto transfere e coloca em cache a imagem da origem a montante se não existir uma cópia em cache.

Se pedir uma imagem de um repositório virtual, o Artifact Registry procura a imagem pedida nos repositórios a montante. Se pedir uma versão que esteja disponível em mais do que um repositório a montante, o Artifact Registry escolhe um repositório a montante para usar com base nas definições de prioridade configuradas para o repositório virtual.

Por exemplo, considere um repositório virtual com as seguintes definições de prioridade para repositórios upstream:

  • main-repo: prioridade definida como 100
  • secondary-repo1: prioridade definida como 80.
  • secondary-repo2: prioridade definida como 80.
  • test-repo: prioridade definida como 20.

main-repo tem o valor de prioridade mais elevado, pelo que o repositório virtual é sempre pesquisado primeiro.

Ambos os elementos secondary-repo1 e secondary-repo2 têm a prioridade definida como 80. Se uma imagem pedida não estiver disponível no main-repo, o Artifact Registry pesquisa estes repositórios em seguida. Uma vez que ambos têm o mesmo valor de prioridade, o Artifact Registry pode optar por publicar uma imagem de qualquer um dos repositórios se a versão estiver disponível em ambos.

test-repo tem o valor de prioridade mais baixo e vai publicar um artefacto armazenado se nenhum dos outros repositórios a montante o tiver.

Extrair imagens com o crictl

crictl é uma ferramenta de linha de comandos útil para os programadores de tempo de execução da CRI depurarem o respetivo tempo de execução sem terem de configurar componentes do Kubernetes. Se os nós do Google Kubernetes Engine usarem um tempo de execução do containerd, pode extrair imagens do Artifact Registry através do crictl.

Uma vez que o crictl é principalmente uma ferramenta de resolução de problemas, alguns comandos do Docker, como o envio ou a etiquetagem de imagens, não estão disponíveis.

Para extrair uma imagem do Artifact Registry:

  1. Na Google Cloud consola, aceda à página Instâncias de VM.

    Aceder a Instâncias de VM

  2. SSH para o nó no qual está a resolver problemas.

  3. Obtenha um token de acesso para autenticação com o repositório.

    curl -s "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google"
  4. Extraia a imagem através de crictl pull --creds e do valor access_token

    crictl pull --creds "oauth2accesstoken:ACCESS_TOKEN" LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE:TAG

    ou

    crictl pull --creds "oauth2accesstoken:ACCESS_TOKEN" LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE@IMAGE-DIGEST

    O resultado tem o seguinte aspeto:

    Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5

O que se segue?