Solução de problemas

Nesta seção explicamos como solucionar problemas comuns do Container Registry e Docker.

Projetos de escopo de domínio

Se você receber o erro invalid reference format, pode ser que você tenha um projeto com escopo no domínio.

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

Erro: status 405: v1 Registry API is disabled.

Se um erro, como "v1 Registry API está desativada", for exibido sempre que você tentar extrair ou enviar imagens, verifique se o nome do host, código do projeto, nome da imagem, marcador ou resumo estão corretos.

Para ver os marcadores e resumo da imagem, execute o seguinte comando:

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

Exemplo:

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

Para ver mais informações sobre como listar tags e resumos de imagem, consulte Como gerenciar imagens.

Problemas de permissão

As seções a seguir descrevem as soluções para problemas específicos de permissões. Certifique-se de que você tenha as permissões necessárias para realizar push ou pull. Veja Permissões e papéis.

Se você ativou o acesso uniforme no nível do bucket em um bucket de armazenamento usado pelo Container Registry, talvez tenha problemas para realizar push e pull para o Container Registry.

Para corrigir problemas de acesso, verifique se você tem as permissões necessárias para push ou pull. Essas permissões estão listadas em Permissões e papéis.

Se você encontrar um erro permission denied, como no exemplo a seguir:

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

Talvez seja necessário adicionar você mesmo ao grupo de usuários docker.

Execute o seguinte comando no shell ou janela do terminal:

  sudo usermod -a -G docker ${USER}

Reinicie o sistema depois de adicionar você mesmo ao grupo de usuários docker.

Problemas de permissão ao comunicar com o Container Registry

Se for exibido um erro de permissão como este:

Permission denied: Unable to create the repository, please check that you have access to do so
  1. Verifique se o faturamento foi ativado para o projeto.

  2. Verifique seu acesso:

    1. Verifique se você está autenticado para gcloud executando o seguinte comando:

      gcloud init
      
    2. Certifique-se de que o Docker esteja configurado para usar gcloud como um assistente de credencial do Container Registry executando o seguinte comando:

      gcloud auth configure-docker
      
    3. Verifique se docker-credential-gcloud pode ser executado:

      docker-credential-gcloud list
      

      Será exibido um objeto JSON com o registro de destino como uma de suas 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 você tem permissão para gravar no projeto do Cloud Storage de destino da imagem. Caso não tenha, peça para um administrador conceder acesso ao seu usuário e tente novamente.

    5. Se o problema persistir mesmo com a permissão correta, talvez falte no seu token de acesso um dos seguintes escopos:

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

      Para verificar, primeiro receba o token de acesso. Isso varia de um aplicativo para outro, por exemplo, se você estiver usando um token de acesso de uma conta de serviço padrão do Compute Engine, poderá seguir estas instruções para vê-lo.

      Assim que você receber o token de acesso, use este comando para verificar os escopos usados para conseguir o token:

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

      Caso os escopos mencionados não estejam incluídos, corrija o problema para que eles sejam incluídos ao conseguir o token de acesso no seu código. Por exemplo, para tokens gerados especificamente para contas de serviço padrão na sua máquina virtual do Compute Engine, corrija a configuração do escopo para essa máquina e recrie o token.

Problemas de permissão ao enviar e extrair imagens

A instância de VM que envia ou extrai imagens precisa ser configurada corretamente, com as permissões do IAM e escopos de acesso necessários para acessar o bucket de armazenamento do Container Registry. Para informações sobre as configurações necessárias, consulte Como usar o Container Registry com o Google Cloud.

Erro de ImagePullBackoff do Google Kubernetes Engine

O GKE retorna um erro ImagePullBackoff quando não consegue extrair uma imagem de um registro. O erro pode ocorrer porque a imagem não pode ser encontrada ou porque os nós não têm permissões para extrair do registro. Por padrão, os nós do GKE têm permissões para extrair imagens do Container Registry quando o registro está no mesmo projeto do Google Cloud que os nós.

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

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

As restrições da política da organização podem afetar o uso do Container Registry quando se aplicam aos serviços usados pelo Container Registry, incluindo restrições que exigem o uso de chaves de criptografia gerenciadas pelo cliente (CMEK).

Erro de solicitação inválida 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 é possível enviar imagens para o Container Registry se os buckets de armazenamento não estiverem criptografados com a CMEK. A seguinte mensagem será retornada:

unknown: Bad Request

Quando constraints/gcp.restrictCmekCryptoKeyProjects está configurado, os buckets de armazenamento precisam ser criptografados com uma CryptoKey de um projeto, uma pasta ou uma organização permitida. Os buckets atuais que não estão em conformidade precisam ser configurados para usar a chave necessária por padrão.

Para criptografar os buckets de armazenamento, consulte as instruções do Cloud Storage. O nome do bucket de um host de registro tem um dos seguintes formatos:

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

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

Quando você ativa a API Container Registry em um projeto do Google Cloud, o Container Registry tenta criar automaticamente um tópico do Pub/Sub com o ID de tópico gcr usando chaves de criptografia gerenciadas pelo Google.

Quando a API Pub/Sub está na lista de políticas Deny para a restrição constraints/gcp.restrictNonCmekServices, os tópicos precisam ser criptografados com a CMEK. As solicitações para criar um tópico sem a criptografia CMEK vão falhar.

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

Limites de cota

Se você exceder o limite de cota do Container Registry, poderá ver uma mensagem de erro como esta:

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

Para evitar exceder o limite de cota fixo, é possível:

  • Aumentar o número de endereços IP que conversam com o Container Registry. As cotas são por endereço IP.
  • Adicionar novas tentativas que introduzam um atraso. Por exemplo, você poderia usar retirada exponencial.

Ponto de extremidade de registro inválido com boot2docker

Se estiver com problemas para acessar o Container Registry 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

Reinicie o boot2docker:

boot2docker stop
boot2docker start

Erro ao enviar uma imagem no nível raiz

Quando você tenta enviar uma imagem de contêiner, o envio falha com uma mensagem que inclui:

Pushing to root-level images is disabled

Essa mensagem indica que você marcou a imagem com o nome do host e a imagem, mas não incluiu o ID do projeto.

Marque a imagem usando o formato de caminho correto:

HOSTNAME/PROJECT-ID/IMAGE:TAG

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

Docker no Mac

Se encontrar qualquer problema com o Docker no Mac, será necessário tentar uma solução alternativa. Os erros podem incluir operações de envio e extração do Docker sem resposta ou um erro de rede como o seguinte:

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

Se encontrar esses erros, siga as seguintes instruções:

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

  • Desative "Securely store docker logins in macOS keychain" no menu de preferências do Docker.

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