Risoluzione dei problemi

Questa sezione spiega come risolvere i problemi comuni di Container Registry e Docker che le applicazioni presentino problemi di prestazioni.

Progetti con ambito dominio

Se ricevi l'errore invalid reference format, uno dei problemi potrebbe essere un progetto con ambito dominio.

Se l'ambito del progetto è il tuo dominio, l'ID progetto include dominio e i due punti, ad esempio: example.com:my-project. Consulta Progetti con ambito dominio su come utilizzare gli ID progetto che includono un dominio.

Errore: stato 405: v1 Registry API is disabled.

Se riscontri continuamente un errore, come "L'API v1 Registry è disabilitata" quando esegui il pull o il push delle immagini, assicurati che nome host, ID progetto, immagine e l'ortografia del tag o del digest sia corretta.

Per vedere i tag e il digest 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 a problemi specifici relativi alle autorizzazioni. Assicurati sempre di disporre delle autorizzazioni necessarie per eseguire il push o il pull. Vedi Autorizzazioni e ruoli.

Se hai abilitato l'accesso uniforme a livello di bucket in un bucket di archiviazione usato da Container Registry, allora hai problemi di accesso tramite push e pull a Container Registry.

Per risolvere i problemi di accesso, assicurati di disporre delle autorizzazioni necessarie per eseguire il push o pull. Queste autorizzazioni sono elencate in Autorizzazioni e ruoli.

Se si verifica un errore permission denied, come il seguente esempio:

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

Potresti dover 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 riscontri un errore di autorizzazione come il seguente:

Permission denied: Unable to create the repository, please check that you have access to do so
  1. Verifica che la fatturazione sia abilitata. per il tuo progetto.

  2. Verifica il tuo accesso:

    1. Assicurati di avere eseguito l'autenticazione per gcloud eseguendo questo comando :

      gcloud init
      
    2. Assicurati che Docker sia configurato in modo da utilizzare gcloud come Assistente per le credenziali di Container Registry mediante l'esecuzione del comando seguente:

      gcloud auth configure-docker
      
    3. 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. Per esempio:

      {
        "https://asia.gcr.io": "oauth2accesstoken",
        "https://eu.gcr.io": "oauth2accesstoken",
        "https://gcr.io": "oauth2accesstoken",
        "https://us.gcr.io": "oauth2accesstoken"
      }
      
    4. Quindi, verifica di avere l'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 al tuo utente. e riprova.

    5. Se il problema persiste anche dopo aver ottenuto l'autorizzazione corretta, è possibile che il token di accesso si ottiene senza uno di questi ambiti:

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

      Per verificarlo, ottieni innanzitutto il token di accesso. Questo varia da tra applicazioni, ad esempio se utilizzi un token di accesso un account di servizio predefinito di Compute Engine, puoi seguire le istruzioni qui per ottenerlo.

      Dopo aver ottenuto personalmente il token di accesso, puoi utilizzare questo comando per esaminare gli ambiti utilizzati per ottenere il token di accesso:

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

      Se gli ambiti indicati non sono inclusi, risolvi il problema per assicurarti includerle quando si ottiene il token di accesso nel codice. Ad esempio, per generati appositamente per l'account di servizio predefinito della macchina virtuale Compute Engine, devi correggere l'impostazione dell'ambito una macchina virtuale e ricrearla.

Problemi di autorizzazione relativi al push e al 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 a Container Registry Cloud Storage. Per informazioni sulle impostazioni richieste, consulta Utilizzo di Container Registry con Google Cloud.

Errore ImagePullBackoff da Google Kubernetes Engine

GKE restituisce un errore ImagePullBackoff quando non riesce a eseguire il pull un'immagine da un registry. L'errore potrebbe verificarsi perché l'immagine non può essere trovato o perché i nodi non dispongono delle autorizzazioni di cui eseguire il pull dal registry. Per impostazione predefinita, i nodi GKE dispongono delle autorizzazioni eseguire il pull delle immagini da Container Registry quando il registro si trova nello stesso progetto Google Cloud come nodi.

La documentazione di GKE include i passaggi per identificare il causa principale e risolverlo.

Applicazione dei criteri dell'organizzazione

I vincoli dei criteri dell'organizzazione possono influire sull'utilizzo dei di Container Registry quando si applicano ai servizi utilizzati, inclusi i vincoli che richiedono l'uso chiavi di crittografia gestite dal cliente (CMEK).

Errore di richiesta non valido durante il push di un'immagine

Se l'API Cloud Storage è nell'elenco dei criteri Deny per la classe 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

Quando l'app constraints/gcp.restrictCmekCryptoKeyProjects è configurata, i bucket di archiviazione devono essere criptati con una CryptoKey di un progetto consentito, cartella o organizzazione. I bucket esistenti non conformi devono essere configurato in modo da utilizzare la chiave richiesta per impostazione predefinita.

Per criptare i bucket di archiviazione, consulta Istruzioni per Cloud Storage. Il nome del bucket per un host del registry presenta uno dei seguenti formati:

  • artifacts.PROJECT-ID.appspot.com per le immagini archiviate sull'host gcr.io
  • STORAGE-REGION.artifacts.PROJECT-ID.appspot.com per le immagini memorizzate su asia.gcr.io, eu.gcr.io o us.gcr.io.

L'argomento Pub/Sub gcr non è stato creato automaticamente

Quando attivi l'API Container Registry in una progetto Google Cloud, Container Registry tenta di creare automaticamente Argomento Pub/Sub con ID argomento gcr gestito da Google chiavi di crittografia.

Quando l'API Pub/Sub si trova nell'elenco dei criteri Deny per la 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 Pub/Sub istruzioni per criptare gli argomenti.

Limiti di quota

Se superi il limite di quota di Container Registry, potresti visualizzare un errore messaggi come questo:

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

Per evitare di superare il limite di quota fisso, puoi:

  • Aumentare 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 backoff esponenziale.

Endpoint del registro di sistema non valido con boot2docker

Se hai difficoltà a raggiungere Container Registry da un boot2docker questo ambiente:

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, l'operazione non riesce e viene visualizzato un messaggio che include:

Pushing to root-level images is disabled

Questo messaggio indica che hai taggato l'immagine con il nome host e l'immagine, ma non ha incluso l'ID progetto.

Tagga l'immagine utilizzando il tipo di tag corretto formato 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 push/pull 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 riscontri 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 è abilitato nel menu Preferenze di Docker.

  • Assicurati di eseguire la versione di Docker più recente.