Questa sezione spiega come risolvere i problemi comuni di Container Registry e Docker.
Progetti con ambito di dominio
Se ricevi l'errore invalid reference format
, un problema potrebbe essere dovuto al progetto con ambito a livello di dominio.
Se il progetto ha come ambito il tuo dominio, l'ID progetto include il dominio e i due punti, ad esempio example.com:my-project
. Vedi Progetti con ambito di dominio per informazioni su come lavorare con ID di progetto che includono un dominio.
Errore: stato 405: v1 Registry API is disabled.
Se si verifica continuamente un errore come "L'API Registry v1 è disabilitata" durante il pull o il push delle immagini, assicurati che nome host, ID progetto, nome immagine e tag o digest siano stati digitati correttamente.
Per visualizzare il digest e i tag dell'immagine, esegui questo comando:
gcloud container images list-tags [HOSTNAME]/[PROJECT-ID]/[IMAGE]
Ad esempio:
gcloud container images list-tags gcr.io/my-project/my-image
Per ulteriori informazioni su come elencare i tag immagine e le sintesi, consulta Gestione delle immagini.
Problemi di autorizzazione
Le seguenti sezioni descrivono le soluzioni per problemi specifici relativi alle autorizzazioni. Assicurati sempre di disporre delle autorizzazioni necessarie per eseguire il push o il pull. Vedi Autorizzazioni e ruoli.
Problemi di autorizzazione relativi all'accesso uniforme a livello di bucket
Se hai abilitato l'accesso uniforme a livello di bucket su un bucket di archiviazione utilizzato da Container Registry, potresti riscontrare problemi di accesso durante il push e il pull in Container Registry.
Per risolvere i problemi di accesso, assicurati di disporre delle autorizzazioni necessarie per eseguire il push o il pull. Queste autorizzazioni sono elencate in Autorizzazioni e ruoli.
Problemi di autorizzazione relativi alla configurazione di Docker sulla macchina locale
Se si verifica un errore permission denied
, come nell'esempio seguente:
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
Potrebbe essere necessario aggiungerti al gruppo di utenti docker
.
Esegui questo comando nella shell o nella finestra del terminale:
sudo usermod -a -G docker ${USER}
Riavvia il sistema dopo esserti aggiunto al gruppo di utenti docker
.
Problemi di autorizzazione durante la comunicazione con Container Registry
Se si verifica un errore di autorizzazione come il seguente:
Permission denied: Unable to create the repository, please check that you have access to do so
Verifica che la fatturazione sia abilitata per il tuo progetto.
Verifica l'accesso:
Assicurati di aver eseguito l'autenticazione per
gcloud
eseguendo questo comando:gcloud init
Assicurati che Docker sia configurato per utilizzare
gcloud
come helper delle credenziali di Container Registry eseguendo questo comando:gcloud auth configure-docker
Verifica che sia possibile eseguire
docker-credential-gcloud
:docker-credential-gcloud list
Dovresti vedere un oggetto JSON con il registro di destinazione come una delle sue chiavi. Ad esempio:
{ "https://asia.gcr.io": "oauth2accesstoken", "https://eu.gcr.io": "oauth2accesstoken", "https://gcr.io": "oauth2accesstoken", "https://us.gcr.io": "oauth2accesstoken" }
Successivamente, verifica di disporre dell'autorizzazione per scrivere in Cloud Storage nel progetto a cui stai eseguendo il push. In caso contrario, chiedi a un amministratore di concedere l'accesso all'utente e riprova.
Se il problema persiste dopo aver ottenuto l'autorizzazione corretta, è possibile che il token di accesso sia stato ottenuto senza uno dei seguenti ambiti:
https://www.googleapis.com/auth/devstorage.read_write
https://www.googleapis.com/auth/devstorage.full_control
Per verificarlo, devi prima ottenere il token di accesso personalmente. Varia in base all'applicazione; ad esempio, se utilizzi un token di accesso di un account di servizio predefinito di Compute Engine, puoi seguire le istruzioni qui per ottenerlo.
Una volta ottenuto il token di accesso, puoi utilizzare questo comando per esaminare gli ambiti utilizzati per ottenere il token:
curl -H "Authorization: Bearer <your access token>" https://www.googleapis.com/oauth2/v1/tokeninfo
Se gli ambiti menzionati non sono inclusi, risolvi il problema per assicurarti di includerli quando ottieni il token di accesso nel tuo codice. Ad esempio, per i token generati specificamente per l'account di servizio predefinito sulla tua macchina virtuale Compute Engine, devi correggere l'impostazione dell'ambito per quella macchina virtuale e ricrearla.
Problemi di autorizzazione per il push e il pull delle immagini
L'istanza VM che esegue il push o il pull delle immagini deve essere configurata correttamente con le autorizzazioni IAM e gli ambiti di accesso richiesti per accedere al bucket di archiviazione di Container Registry. Per informazioni sulle impostazioni richieste, vedi Utilizzo di Container Registry con Google Cloud.
Errore ImagePullBackoff da Google Kubernetes Engine
GKE restituisce un errore ImagePullBackoff
quando non è in grado di eseguire il pull di un'immagine da un registro. L'errore potrebbe verificarsi perché non è possibile trovare l'immagine o perché i nodi non dispongono delle autorizzazioni per eseguire il pull dal registro. Per impostazione predefinita, i nodi GKE sono autorizzati a estrarre immagini da Container Registry quando il registro si trova nello stesso progetto Google Cloud dei nodi.
La documentazione di GKE include i passaggi per identificare la causa principale e risolvere il problema.
Applicazione dei criteri dell'organizzazione
I vincoli dei criteri dell'organizzazione possono influire sull'utilizzo di Container Registry quando si applicano ai servizi utilizzati da Container Registry, inclusi i vincoli che richiedono l'utilizzo di chiavi di crittografia gestite dal cliente (CMEK).
Errore di richiesta errata durante il push di un'immagine
Se l'API Cloud Storage si trova nell'elenco dei criteri Deny
per il vincolo constraints/gcp.restrictNonCmekServices
, non puoi eseguire il push delle immagini a Container Registry se i bucket di archiviazione sottostanti non sono criptati con CMEK. Viene restituito il seguente messaggio:
unknown: Bad Request
Se constraints/gcp.restrictCmekCryptoKeyProjects
è configurato, i bucket di archiviazione devono essere criptati con una CryptoKey di un progetto, una cartella o un'organizzazione consentiti. I bucket esistenti non conformi devono essere configurati in modo da utilizzare la chiave richiesta per impostazione predefinita.
Per criptare i bucket di archiviazione, consulta le istruzioni di Cloud Storage. Il nome del bucket di un host del registry ha uno dei seguenti formati:
artifacts.PROJECT-ID.appspot.com
per le immagini archiviate sull'hostgcr.io
STORAGE-REGION.artifacts.PROJECT-ID.appspot.com
per le immagini archiviate suasia.gcr.io
,eu.gcr.io
ous.gcr.io
.
L'argomento Pub/Sub gcr non è stato creato automaticamente
Quando attivi l'API Container Registry in un progetto Google Cloud, Container Registry tenta di creare automaticamente un argomento Pub/Sub con ID argomento gcr
utilizzando chiavi di crittografia gestite da Google.
Quando l'API Pub/Sub si trova nell'elenco dei criteri Deny
per il vincolo constraints/gcp.restrictNonCmekServices
, gli argomenti devono essere criptati con CMEK. Le richieste per creare un argomento senza crittografia CMEK non andranno a buon fine.
Per creare l'argomento gcr
con la crittografia CMEK, consulta le istruzioni di Pub/Sub per la crittografia degli argomenti.
Limiti di quota
Se superi il limite di quota di Container Registry, potresti visualizzare messaggi di errore come questo:
Error: Status 429 trying to pull repository [...] "Quota Exceeded."
Per evitare di superare il limite di quota fisso, puoi:
- Aumenta il numero di indirizzi IP che comunicano con Container Registry. Le quote sono per indirizzo IP.
- Aggiungi nuovi tentativi che introducono un ritardo. Ad esempio, potresti utilizzare il backoff esponenziale.
Endpoint del registro non valido con boot2docker
Se hai difficoltà a raggiungere Container Registry da un 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
Potrebbe essere necessario riavviare boot2docker:
boot2docker stop
boot2docker start
Errore relativo al push di un'immagine a livello principale
Quando provi a eseguire il push di un'immagine container, il push non riesce e viene visualizzato un messaggio che include:
Pushing to root-level images is disabled
Questo messaggio indica che hai applicato il tagging all'immagine con il nome host e l'immagine, ma non hai incluso l'ID progetto.
Tagga l'immagine utilizzando il formato corretto del percorso immagine:
HOSTNAME/PROJECT-ID/IMAGE:TAG
Ad esempio: gcr.io/web-project/web-app:1.0
.
Docker su Mac
Se riscontri problemi con Docker su Mac, potresti dover provare una soluzione alternativa. Gli errori possono includere operazioni di push/pull di Docker che non rispondono o un errore di rete simile al seguente:
Post https://us.gcr.io/v2/[repo name]/blobs/uploads/: dial tcp xx.xxx.xx.xx:xxx: i/o timeout
Se si verificano questi errori, prova a procedere nel seguente modo:
Esegui il comando
docker-machine restart default
nel terminale Mac per riavviare il daemon Docker.Assicurati che l'opzione"Archivia in modo sicuro gli accessi Docker nel portachiavi macOS" non sia abilitata nel menu Preferenze di Docker.
Assicurati di eseguire la versione Docker più recente.