Nesta seção explicamos como solucionar problemas comuns do Container Registry e do 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]
Por 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.
Problemas de permissão relacionados ao acesso uniforme no nível do bucket
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.
Problemas de permissão relacionados à configuração do Docker no computador local
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
Verifique se o faturamento foi ativado para o projeto.
Verifique seu acesso:
Verifique se você está autenticado para
gcloud
executando o seguinte comando:gcloud init
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
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" }
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.
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 mais informações sobre as configurações necessárias, consulte Como usar o Container Registry com o Google Cloud.
Erro 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 a serviços que ele usa, 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 subjacentes não estiverem criptografados
com o CMEK. A seguinte mensagem é retornada:
unknown: Bad Request
Quando constraints/gcp.restrictCmekCryptoKeyProjects
está configurado,
os buckets de armazenamento precisam ser criptografados com uma CryptoKey de um projeto,
pasta ou organização permitidos. Os buckets atuais que não estão em conformidade precisam ser
configurados para usar a chave necessária por padrão.
Para criptografar seus buckets de armazenamento, consulte as instruções do Cloud Storage. O nome do bucket de um host de registro tem um destes formatos:
artifacts.PROJECT-ID.appspot.com
para imagens armazenadas no hostgcr.io
STORAGE-REGION.artifacts.PROJECT-ID.appspot.com
para imagens armazenadas emasia.gcr.io
,eu.gcr.io
ouus.gcr.io
.
O tópico do Pub/Sub do gcr não foi criado automaticamente
Quando você ativa a API Container Registry em um projeto do Google Cloud, ela tenta criar automaticamente um tópico do Pub/Sub com o ID gcr
usando chaves de criptografia gerenciadas pelo Google.
Quando a API Pub/Sub está na lista de políticas Deny
da restrição constraints/gcp.restrictNonCmekServices
, os tópicos precisam ser criptografados com o 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 criptografar 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 push 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 correto do caminho da imagem:
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.