Esegui il push e il pull delle immagini

Questa pagina descrive il push e il pull delle immagini container con Docker. Fornisce inoltre informazioni sul pull di immagini con lo strumento crictl se stai risolvendo i problemi in Google Kubernetes Engine.

Per informazioni sul deployment in ambienti di runtime di Google Cloud, consulta Eseguire il deployment in Google Cloud.

Per istruzioni su come elencare, taggare ed eliminare le immagini, consulta Gestione delle immagini.

Prima di iniziare

  1. Se il repository di destinazione non esiste, creane uno nuovo.
  2. Devi disporre almeno dell'access come Writer Artifact Registry al repository.
  3. Installa Docker, se non è già installato.

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per eseguire il push e il pull delle immagini, chiedi all'amministratore di concederti i seguenti ruoli IAM nel repository:

Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso.

Potresti anche essere in grado di ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

Autenticazione in un repository

Devi eseguire l'autenticazione nei repository ogni volta che utilizzi Docker o un altro client di terze parti con un repository Docker. Questa sezione fornisce un breve riepilogo di ciò che è necessario eseguire correttamente per l'autenticazione. Per istruzioni dettagliate, consulta Configurare l'autenticazione per Docker.

Utilizzo di un assistente per le credenziali

Per l'helper per le credenziali gcloud CLI o l'helper per le credenziali autonomo, gli host di Artifact Registry che utilizzi devono essere presenti nel file di configurazione Docker.

Artifact Registry non aggiunge automaticamente tutti gli host del registro al file di configurazione Docker. Quando è presente un numero elevato di registry configurati, i tempi di risposta di Docker sono notevolmente più lenti. Per ridurre al minimo il numero di registri nel file di configurazione, aggiungi gli host necessari al file.

Per confermare quali host sono configurati, esegui questo comando per visualizzare i contenuti del file di configurazione:

  • Linux: cat ~/.docker/config.json
  • Windows: cat %USERPROFILE%\.docker\config.json

La sezione credHelpers elenca gli host Docker di Artifact Registry configurati. I nomi host terminano con -docker.pkg.dev. L'esempio seguente mostra alcuni host configurati per l'helper delle credenziali gcloud CLI.

"credHelpers": {
  "asia.gcr.io": "gcloud",
  "eu.gcr.io": "gcloud",
  "gcr.io": "gcloud",
  "marketplace.gcr.io": "gcloud",
  "northamerica-northeast1-docker.pkg.dev": "gcloud",
  "us-central1-docker.pkg.dev": "gcloud",
  "us-east1-docker.pkg.dev": "gcloud",
  "us.gcr.io": "gcloud"
}

Se un host che vuoi utilizzare non è nell'elenco, esegui di nuovo l'helper per le credenziali per aggiungere l'host. Ad esempio, il seguente comando aggiunge us-east1-docker.pkg.dev.

  • Assistente per le credenziali gcloud CLI:

    gcloud auth configure-docker us-east1-docker.pkg.dev
    
  • Assistente per le credenziali autonomo

    docker-credential-gcr configure-docker us-east1-docker.pkg.dev
    

Utilizzo di un token di accesso

Per l'autenticazione del token di accesso, devi generare un token e utilizzarlo come password con il comando docker login. I token sono validi per 60 minuti, quindi devi autenticarti poco prima di eseguire il tagging, il push o il pull delle immagini.

L'esempio seguente genera un token di accesso utilizzando l'identità dell'account di servizio e poi esegue l'autenticazione in Artifact Registry. Per generare un token in questo modo, devi disporre delle autorizzazioni nel ruolo Creatore token account di servizio (roles/iam.serviceAccountTokenCreator).

Linux

gcloud auth print-access-token \
  --impersonate-service-account  ACCOUNT | docker login \
  -u oauth2accesstoken \
  --password-stdin http://LOCATION-docker.pkg.dev

Windows

gcloud auth print-access-token \
--impersonate-service-account  ACCOUNT

ya29.8QEQIfY_...

docker login -u oauth2accesstoken -p "ya29.8QEQIfY_..." \
http://LOCATION-docker.pkg.dev

Se non disponi delle autorizzazioni per impersonare un account di servizio, puoi attivare l'account di servizio nella sessione gcloud CLI, quindi ottenere un token. Per maggiori dettagli, consulta le istruzioni per configurare l'autenticazione del token di accesso.

Utilizzo di una chiave dell'account di servizio

Per una chiave dell'account di servizio, utilizzala come password con il comando docker login.

Ad esempio, il seguente comando utilizza la chiave dell'account di servizio con codifica Base64 nel file key.json per eseguire l'autenticazione in us-east1-docker.pkg.dev.

Linux

cat key.json | docker login -u _json_key_base64 --password-stdin \
http://us-east1-docker.pkg.dev

Windows

docker login -u _json_key_base64 --password-stdin http://us-east1-docker.pkg.dev < key.json

Per maggiori dettagli, consulta le istruzioni per configurare l'autenticazione delle chiavi dell'account di servizio.

Push di un'immagine

Modalità repository: standard

Per eseguire il push di un'immagine locale in un repository Docker standard, assegna il nome del repository ed esegui il push dell'immagine.

Se l'immutabilità dei tag è abilitata per il repository Docker di Artifact Registry, un tag deve sempre fare riferimento allo stesso digest immagine nel repository. Non puoi utilizzare il tag su un'altra versione della stessa immagine di cui esegui il push nel repository. Per ulteriori informazioni su digest di immagini, tag e immutabilità dei tag, consulta Versioni delle immagini container.

Per le immagini di grandi dimensioni si applicano i seguenti limiti:

Tempo di caricamento
Se esegui l'autenticazione ad Artifact Registry utilizzando un token di accesso, il token è valido solo per 60 minuti. Se prevedi che il tempo di caricamento superi i 60 minuti, utilizza un metodo di autenticazione diverso.
Dimensioni dell'immagine
La dimensione massima dell'artefatto è 5 TB.
Artifact Registry non supporta i caricamenti in blocchi Docker. Alcuni strumenti supportano il caricamento di immagini di grandi dimensioni con caricamenti in blocchi o con un singolo caricamento monolitico. Devi utilizzare i caricamenti monolitici per eseguire il push delle immagini in Artifact Registry.

Taggare l'immagine locale

  1. Assicurati di aver eseguito l'autenticazione nel repository.

  2. Determina il nome dell'immagine. Il formato del nome completo dell'immagine è:

    LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE
    

    Sostituisci i seguenti valori:

    • LOCATION è la località a livello di una o più regioni del repository in cui è archiviata l'immagine, ad esempio us-east1 o us.

    • PROJECT-ID è l'ID progetto della console Google Cloud. Se l'ID progetto contiene i due punti (:), consulta Progetti con ambito di dominio.

    • REPOSITORY è il nome del repository in cui è archiviata l'immagine.

    • IMAGE è il nome dell'immagine. Può essere diverso dal nome locale dell'immagine.

    Ad esempio, considera un'immagine con le seguenti caratteristiche:

    • Località del repository: us-east1
    • Nome repository: my-repo
    • ID progetto: my-project
    • Nome immagine locale: my-image
    • Nome immagine target: test-image

    Il nome di questa immagine per questo esempio è:

    us-east1-docker.pkg.dev/my-project/my-repo/test-image
    

    Per maggiori dettagli sul formato dei nomi delle immagini, inclusa la gestione dei progetti con ambito a livello di dominio, consulta Nomi di repository e immagini.

  3. Assegna all'immagine locale il tag con il nome del repository.

    docker tag SOURCE-IMAGE LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE:TAG
    

    Sostituisci SOURCE-IMAGE con il nome o l'ID immagine locale e TAG con il tag. Se non specifichi un tag, Docker applica il tag latest predefinito.

    Se l'impostazione dei tag immagine immutabili è abilitata, i tag devono essere univoci per ogni versione dell'immagine, incluso il tag latest. Non puoi eseguire il push di un'immagine nel repository se il tag è già utilizzato da un'altra versione della stessa immagine nel repository. Per verificare se l'impostazione è abilitata per il repository, esegui il comando:

    gcloud artifacts repositories describe REPOSITORY \
        --project=PROJECT-ID \
        --location=LOCATION
    

    Per l'immagine di esempio del passaggio precedente, utilizza il seguente comando se l'immagine locale my-image si trova nella directory attuale:

    docker tag my-image us-east1-docker.pkg.dev/my-project/my-repo/test-image
    

    Per applicare un tag specifico, utilizza il comando:

    docker tag SOURCE-IMAGE LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE:TAG
    

    Per utilizzare il tag staging con l'immagine di esempio, aggiungi :staging al comando:

    docker tag my-image us-east1-docker.pkg.dev/my-project/my-repo/test-image:staging
    

Push dell'immagine con tag ad Artifact Registry

  1. Assicurati di aver eseguito l'autenticazione nel repository.

    Se hai utilizzato gcloud auth configure-docker o docker-credential-gcr configure-docker per configurare il client Docker, verifica che il nome host di destinazione sia presente nel file di configurazione Docker.

  2. Esegui il push dell'immagine taggata con il comando:

    docker push LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE
    

    Questo comando esegue il push dell'immagine con il tag latest. Se vuoi eseguire il push di un'immagine con un tag diverso, utilizza il comando:

    docker push LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE:TAG
    

Quando esegui il push di un'immagine, questa viene archiviata nel repository specificato.

Dopo il push dell'immagine, puoi:

  • Vai alla console Google Cloud per visualizzare l'immagine.

  • Esegui il comando gcloud per visualizzare i tag dell'immagine e il digest generato automaticamente:

    gcloud artifacts docker images list \
    LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE [--include-tags]
    

    L'output di esempio seguente mostra digest di immagini troncate, ma il comando restituisce sempre il digest completo dell'immagine.

     IMAGE                                                 DIGEST         CREATE_TIME          UPDATE_TIME
      us-east1-docker.pkg.dev/my-project/my-repo/my-image  sha256:85f...  2019-04-10T15:08:45  2019-04-10T15:08:45
      us-east1-docker.pkg.dev/my-project/my-repo/my-image  sha256:238...  2019-04-10T17:23:53  2019-04-10T17:23:53
      us-east1-docker.pkg.dev/my-project/my-repo/my-image  sha256:85f...  2019-04-10T15:08:46  2019-04-10T15:08:46
    

Pull delle immagini con Docker

Modalità repository: standard, remoto, virtuale

  1. Assicurati di aver eseguito l'autenticazione nel repository.

    Se hai utilizzato gcloud auth configure-docker o docker-credential-gcr configure-docker per configurare il client Docker, verifica che il nome host di destinazione sia presente nel file di configurazione Docker.

  2. Per eseguire il pull da un repository, utilizza il comando:

    docker pull LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE:TAG
    

    o

    docker pull LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE@IMAGE-DIGEST
    

    Sostituisci i seguenti valori:

    • LOCATION è la località a livello di una o più regioni del repository in cui è archiviata l'immagine, ad esempio us-east1 o us.
    • PROJECT è l'ID progetto della console Google Cloud. Se l'ID progetto contiene i due punti (:), consulta Progetti con ambito di dominio.
    • REPOSITORY è il nome del repository in cui è archiviata l'immagine.
    • IMAGE è il nome dell'immagine nel repository.
    • TAG è il tag per la versione dell'immagine di cui vuoi eseguire il pull.
    • IMAGE-DIGEST è il valore hash sha256 dei contenuti dell'immagine. Ogni versione di un'immagine ha un digest di immagini univoco. Nella console Google Cloud, fai clic sull'immagine specifica per visualizzare i relativi metadati. Il digest viene elencato come Digest immagine.

    Ad esempio, considera un'immagine con le seguenti caratteristiche:

    • Località del repository: us-east1
    • Nome repository: my-repo
    • ID progetto: my-project
    • Nome immagine: test-image
    • Tag: staging

    Questo comando per eseguire il pull dell'immagine è:

    docker pull us-east1-docker.pkg.dev/my-project/my-repo/test-image:staging
    

Docker scarica l'immagine specificata.

Se richiedi un'immagine da un repository remoto, quest'ultimo scarica e memorizza nella cache l'immagine dall'origine upstream se non esiste una copia memorizzata nella cache.

Se richiedi un'immagine da un repository virtuale, Artifact Registry cerca nei repository upstream l'immagine richiesta. Se richiedi una versione disponibile in più di un repository upstream, Artifact Registry sceglie un repository upstream da utilizzare in base alle impostazioni di priorità configurate per il repository virtuale.

Ad esempio, considera un repository virtuale con le seguenti impostazioni di priorità per i repository upstream:

  • main-repo: priorità impostata su 100
  • secondary-repo1: priorità impostata su 80.
  • secondary-repo2: priorità impostata su 80.
  • test-repo: priorità impostata su 20.

main-repo ha il valore di priorità più alto, quindi il repository virtuale cerca sempre per primo.

Sia secondary-repo1 che secondary-repo2 hanno la priorità impostata su 80. Se un'immagine richiesta non è disponibile in main-repo, Artifact Registry esegue la ricerca in questi repository. Poiché hanno entrambi lo stesso valore di priorità, Artifact Registry può scegliere di gestire un'immagine da entrambi i repository se la versione è disponibile in entrambi.

test-repo ha il valore di priorità più basso e gestirà un artefatto archiviato se nessuno degli altri repository a monte lo dispone.

Pull delle immagini con crictl in corso...

crictl è uno strumento a riga di comando utile per gli sviluppatori di runtime CRI per eseguire il debug del runtime senza dover configurare componenti Kubernetes. Se i nodi di Google Kubernetes Engine utilizzano un runtime containerd, puoi eseguire il pull delle immagini da Artifact Registry utilizzando crictl.

Poiché crictl è principalmente uno strumento per la risoluzione dei problemi, alcuni comandi Docker come il push o il tagging delle immagini non sono disponibili.

Per eseguire il pull di un'immagine da Artifact Registry:

  1. Nella console Google Cloud, vai alla pagina Istanze VM.

    Vai a Istanze VM

  2. Accedi tramite SSH al nodo di cui stai eseguendo la risoluzione dei problemi.

  3. Ottenere un token di accesso per l'autenticazione con il repository.

    curl -s "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google"
  4. Esegui il pull dell'immagine utilizzando crictl pull --creds e il valore access_token

    crictl pull --creds "oauth2accesstoken:ACCESS_TOKEN" LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE:TAG

    o

    crictl pull --creds "oauth2accesstoken:ACCESS_TOKEN" LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE@IMAGE-DIGEST

    L'output sarà simile al seguente:

    Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5

Passaggi successivi