Artifact Registry è il servizio consigliato per la gestione delle immagini container. Container Registry è ancora supportato, ma riceverà solo correzioni di sicurezza critiche. Scopri come passare ad Artifact Registry.

Risolvere i problemi

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Questa sezione spiega come risolvere i problemi comuni di Container Registry e Docker.

Progetti con ambito a livello di dominio

Se viene visualizzato l'errore invalid reference format, il problema potrebbe essere legato a un progetto con ambito a livello di dominio.

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

Errore: stato 405: v1 Registry API is disabled.

Se riscontri continuamente un errore, ad esempio "l'API v1 Registry è disabilitata" durante il pull o il push di immagini, assicurati che il tuo nome host, l'ID progetto, il nome immagine e il tag o digest siano stati digitati correttamente.

Per vedere i tag e la sintesi 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 scoprire di più su come elencare tag immagine e sintesi, consulta Gestione delle immagini.

Problemi di autorizzazione

Le seguenti sezioni descrivono le soluzioni per problemi specifici di autorizzazione. Assicurati sempre di disporre delle autorizzazioni necessarie per il push o il pull. Vedi Autorizzazioni e ruoli.

Se hai abilitato l'accesso uniforme a livello di bucket su un bucket di archiviazione utilizzato da Container Registry, potresti riscontrare problemi di accesso con il push e il pull di Container Registry.

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

Se si verifica un errore di permission denied, ad 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 doverti aggiungere al gruppo di utenti docker.

Esegui il comando seguente nella shell o nella finestra del terminale:

  sudo usermod -a -G docker ${USER}

Riavvia il sistema dopo averti 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
  1. Verifica che la fatturazione sia abilitata per il progetto.

  2. Verifica l'accesso:

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

      gcloud init
      
    2. Assicurati che Docker sia configurato per l'utilizzo di gcloud come assistente per le credenziali di Container Registry eseguendo questo comando:

      gcloud auth configure-docker
      
    3. Verifica che docker-credential-gcloud possa essere eseguito:

      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://staging-k8s.gcr.io": "oauth2accesstoken",
        "https://us.gcr.io": "oauth2accesstoken"
      }
      
    4. Verifica quindi di avere l'autorizzazione per scrivere in Cloud Storage nel progetto di cui esegui il push. In caso contrario, chiedi a un amministratore di concedere l'accesso all'utente e riprova.

    5. 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, ottieni innanzitutto il token di accesso. Questa operazione varia da un'applicazione all'altra, ad esempio se utilizzi un token di accesso da un account di servizio predefinito di Compute Engine, puoi seguire le istruzioni qui per ottenerlo.

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

      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 macchina virtuale di Compute Engine, dovrai correggere l'impostazione dell'ambito per la 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, consulta 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 oppure perché i nodi non dispongono delle autorizzazioni per l'estrazione dal registro. Per impostazione predefinita, i nodi GKE hanno le autorizzazioni per eseguire il pull delle immagini da Container Registry quando il registro si trova nello stesso progetto Google Cloud dei tuoi 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 vengono applicati ai servizi usati da Container Registry, inclusi i vincoli che richiedono l'utilizzo di chiavi di crittografia gestite dal cliente (CMEK).

Errore durante una richiesta errata durante il push di un'immagine

Quando 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

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

Per criptare i bucket di archiviazione, consulta le istruzioni di Cloud Storage. Il nome del bucket per un host del registry ha 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 archiviate 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 un progetto Google Cloud, Container Registry tenta di creare automaticamente un argomento Pub/Sub con l'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 crittografia CMEK, consulta le istruzioni per la crittografia degli argomenti in Pub/Sub.

Limiti di quota

Se superi il limite di quota di Container Registry, potresti visualizzare un messaggio di errore simile al seguente:

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 parlano a Container Registry. Le quote si riferiscono all'indirizzo IP.
  • Aggiungi nuovi tentativi che introducono un ritardo. Ad esempio, puoi utilizzare il backoff esponenziale.

Endpoint del registro non valido con boot2docker

Se hai problemi 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

Potresti dover riavviare boot2docker:

boot2docker stop
boot2docker start

Docker su Mac

Se riscontri problemi con Docker su Mac, potresti dover provare una soluzione alternativa. Gli errori possono includere operazioni push/pull di Docker non rispondenti 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 eseguire questi passaggi:

  • Esegui il comando docker-machine restart default nel terminale Mac per riavviare il daemon Docker.

  • Assicurati che l'opzione "Memorizza 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.