Resolução de problemas

Esta secção explica como resolver problemas comuns do Container Registry e do Docker.

Projetos no âmbito do domínio

Se receber o erro invalid reference format, um dos problemas pode ser que tenha um projeto com âmbito de domínio.

Se o seu projeto estiver no âmbito do seu domínio, o ID do projeto inclui o domínio e dois pontos, por exemplo: example.com:my-project. Consulte o artigo Projetos com âmbito de domínio para saber como trabalhar com IDs de projetos que incluem um domínio.

Erro: estado 405: v1 Registry API is disabled.

Se encontrar continuamente um erro como "A API v1 Registry está desativada" ao extrair ou enviar imagens, certifique-se de que o nome do anfitrião, o ID do projeto, o nome da imagem e a etiqueta ou o resumo estão escritos corretamente.

Para ver as etiquetas e o resumo da sua imagem, execute o seguinte comando:

gcloud container images list-tags [HOSTNAME]/[PROJECT-ID]/[IMAGE]

Por exemplo:

gcloud container images list-tags gcr.io/my-project/my-image

Para mais informações sobre as etiquetas e os resumos de imagens de fichas, consulte o artigo Gerir imagens.

Problemas de autorização

As secções seguintes descrevem soluções para problemas de autorizações específicos. Certifique-se sempre de que tem as autorizações necessárias para enviar ou extrair. Consulte Autorizações e funções.

Se tiver ativado o acesso de nível de contentor uniforme num contentor de armazenamento usado pelo Container Registry, pode ter problemas de acesso ao enviar e extrair para o Container Registry.

Para corrigir problemas de acesso, certifique-se de que tem as autorizações necessárias para enviar ou extrair. Estas autorizações estão listadas em Autorizações e funções.

Se encontrar um erro permission denied, como o seguinte exemplo:

FATA[0000] Post http://var/run/docker.sock/v1.17/images/gcr.io/container-engine-docs/example/push?tag=: dial unix /var/run/docker.sock: permission denied
ERROR: (gcloud.docker) A Docker command did not run successfully.
Tried to run: 'docker push gcr.io/container-engine-docs/example'
Exit code: 1

Pode ter de se adicionar ao grupo de utilizadores docker.

Execute o seguinte comando na shell ou na janela de terminal:

  sudo usermod -a -G docker ${USER}

Reinicie o sistema depois de se adicionar ao grupo de utilizadores docker.

Problemas de autorização ao comunicar com o Container Registry

Se encontrar um erro de autorização como o seguinte:

Permission denied: Unable to create the repository, please check that you have access to do so
  1. Confirme se a faturação está ativada para o seu projeto.

  2. Valide o seu acesso:

    1. Certifique-se de que tem a autenticação para gcloud executando o seguinte comando:

      gcloud init
      
    2. Certifique-se de que o Docker está configurado para usar gcloud como um auxiliar de credenciais do registo de contentores executando o seguinte comando:

      gcloud auth configure-docker
      
    3. Confirme se o comando docker-credential-gcloud pode ser executado:

      docker-credential-gcloud list
      

      Deve ver um objeto JSON com o registo de destino como uma das respetivas chaves. Por exemplo:

      {
        "https://asia.gcr.io": "oauth2accesstoken",
        "https://eu.gcr.io": "oauth2accesstoken",
        "https://gcr.io": "oauth2accesstoken",
        "https://us.gcr.io": "oauth2accesstoken"
      }
      
    4. Em seguida, verifique se tem autorização para escrever no Cloud Storage no projeto para o qual está a enviar. Caso contrário, peça a um administrador que conceda acesso ao seu utilizador e tente novamente.

    5. Se o problema persistir depois de ter a autorização correta, é possível que o token de acesso seja obtido sem um destes âmbitos:

      • https://www.googleapis.com/auth/devstorage.read_write
      • https://www.googleapis.com/auth/devstorage.full_control

      Para validar esta situação, obtenha primeiro o token de acesso. Isto varia de aplicação para aplicação. Por exemplo, se estiver a usar um token de acesso de uma conta de serviço predefinida do Compute Engine, pode seguir as instruções aqui para o obter.

      Depois de obter o token de acesso, pode usar este comando para ver os âmbitos usados na obtenção do token de acesso:

      curl -H "Authorization: Bearer <your access token>" https://www.googleapis.com/oauth2/v1/tokeninfo
      

      Caso os âmbitos mencionados não estejam incluídos, corrija o problema para se certificar de que os inclui quando obtiver o token de acesso no seu código. Por exemplo, para os tokens gerados especificamente para a conta de serviço predefinida na sua máquina virtual do Compute Engine, tem de corrigir a definição do âmbito dessa máquina virtual e recriá-la.

Problemas de autorização ao enviar e receber imagens

A instância de VM que envia ou extrai imagens tem de estar configurada corretamente com as autorizações de IAM e os âmbitos de acesso necessários para aceder ao contentor de armazenamento do Container Registry. Para obter informações sobre as definições necessárias, consulte o artigo Usar o Container Registry com Google Cloud.

Erro ImagePullBackoff do Google Kubernetes Engine

O GKE devolve um erro ImagePullBackoff quando não consegue obter uma imagem de um registo. O erro pode ocorrer porque não é possível encontrar a imagem ou porque os seus nós não têm autorizações para extrair do registo. Por predefinição, os nós do GKE têm autorizações para extrair imagens do Container Registry quando o registo está no mesmo projeto que os seus nós.Google Cloud

A documentação do GKE inclui passos para identificar a causa principal e resolver o problema.

Aplicação da política da organização

As restrições da política da organização podem afetar a utilização do Container Registry quando se aplicam a serviços que o Container Registry usa, incluindo restrições que exigem a utilização de chaves de encriptação geridas pelo cliente (CMEK).

Erro de pedido inválido ao enviar uma imagem

Quando a API Cloud Storage está na lista de políticas Deny para a restrição constraints/gcp.restrictNonCmekServices, não pode enviar imagens para o Container Registry se os contentores de armazenamento subjacentes não estiverem encriptados com CMEK. É devolvida a seguinte mensagem:

unknown: Bad Request

Quando constraints/gcp.restrictCmekCryptoKeyProjects está configurado, os contentores de armazenamento têm de ser encriptados com uma CryptoKey de um projeto, uma pasta ou uma organização permitidos. Os contentores existentes que não estejam em conformidade têm de ser configurados para usar a chave necessária por predefinição.

Para encriptar os contentores de armazenamento, consulte as instruções do Cloud Storage. O nome do contentor de um anfitrião de registo tem um dos seguintes formatos:

  • artifacts.PROJECT-ID.appspot.com para imagens armazenadas no anfitrião gcr.io
  • STORAGE-REGION.artifacts.PROJECT-ID.appspot.com para imagens armazenadas no asia.gcr.io, eu.gcr.io ou us.gcr.io.

O tópico do Pub/Sub do GCR não foi criado automaticamente

Quando ativa a API Container Registry numGoogle Cloud projeto, o Container Registry tenta criar automaticamente um tópico do Pub/Sub com o ID do tópico gcr através de chaves de encriptação geridas pela Google.

Quando a API Pub/Sub está na Deny lista de políticas para a restrição constraints/gcp.restrictNonCmekServices, os tópicos têm de ser encriptados com CMEK. Os pedidos de criação de um tópico sem encriptação CMEK falham.

Para criar o tópico gcr com encriptação CMEK, consulte as instruções para encriptar tópicos do Pub/Sub.

Limites de quota

Se exceder o limite da quota do Container Registry, pode ver mensagens de erro como estas:

Error: Status 429 trying to pull repository [...] "Quota Exceeded."

Para evitar exceder o limite de quota fixo, pode:

  • Aumente o número de endereços IP que comunicam com o Container Registry. As quotas são por endereço IP.
  • Adicione novas tentativas que introduzam um atraso. Por exemplo, pode usar a retirada exponencial.

Ponto final do registo inválido com o boot2docker

Se tiver problemas ao aceder ao Container Registry a partir de um ambiente boot2docker:

docker push gcr.io/example/sample

Error response from daemon: invalid registry endpoint https://gcr.io/v0/:
  unable to ping registry endpoint https://gcr.io/v0/
v2 ping attempt failed with error: Get https://gcr.io/v2/:
  x509: certificate has expired or is not yet valid
v1 ping attempt failed with error: Get https://gcr.io/v1/_ping:
  x509: certificate has expired or is not yet valid.
If this private registry supports only HTTP or HTTPS with an unknown CA
certificate, please add `--insecure-registry gcr.io` to the daemon's
arguments. In the case of HTTPS, if you have access to the registry's CA
certificate, no need for the flag; simply place the CA certificate at
/etc/docker/certs.d/gcr.io/ca.crt

Pode ter de reiniciar o boot2docker:

boot2docker stop
boot2docker start

Erro ao enviar uma imagem ao nível da raiz

Quando tenta enviar uma imagem de contentor, o envio falha com uma mensagem que inclui:

Pushing to root-level images is disabled

Esta mensagem indica que etiquetou a imagem com o nome do anfitrião e a imagem, mas não incluiu o ID do projeto.

Etiquete a imagem com o formato de caminho de imagem correto:

HOSTNAME/PROJECT-ID/IMAGE:TAG

Por exemplo: gcr.io/web-project/web-app:1.0.

Docker no Mac

Se tiver problemas com o Docker no Mac, pode ter de experimentar uma solução alternativa. Os erros podem incluir operações de envio/receção do Docker sem resposta ou um erro de rede semelhante ao seguinte:

Post https://us.gcr.io/v2/[repo name]/blobs/uploads/: dial tcp xx.xxx.xx.xx:xxx: i/o timeout

Se encontrar estes erros, experimente estes passos:

  • Execute o comando docker-machine restart default no terminal do Mac para reiniciar o daemon do Docker.

  • Certifique-se de que a opção "Armazenar inícios de sessão do Docker em segurança no porta-chaves do macOS" não está ativada no menu Preferências do Docker.

  • Certifique-se de que está a executar a versão mais recente do Docker.