Transférer et extraire des images

Cette page explique comment transférer et extraire des images de conteneurs.

Pour découvrir comment répertorier des images, leur ajouter des tags et les supprimer, consultez la page Gérer les images.

Avant de commencer

  1. Si le dépôt cible n'existe pas, créez un dépôt.
  2. Vous devez au moins disposer d'un accès Rédacteur à Artifact Registry au dépôt.
  3. Installez Docker si ce n'est pas encore fait.

S'authentifier sur un dépôt

Vous devez vous authentifier auprès des dépôts chaque fois que vous utilisez Docker ou un autre client tiers avec un dépôt Docker. Cette section fournit un résumé des éléments à authentifier. Pour obtenir des instructions détaillées, consultez la page Configurer l'authentification pour Docker.

Utiliser un assistant d'identification

Pour l'assistant d'identification gcloud ou l'assistant d'identification autonome, les hôtes Artifact Registry que vous utilisez doivent se trouver dans votre fichier de configuration Docker.

Artifact Registry n'ajoute pas automatiquement tous les hôtes de registre au fichier de configuration Docker. Le temps de réponse de Docker est nettement plus long lorsque de nombreux registres sont configurés. Pour réduire le nombre de registres dans le fichier de configuration, ajoutez les hôtes nécessaires à ce fichier.

Pour confirmer les hôtes configurés, exécutez la commande suivante pour afficher le contenu du fichier de configuration:

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

La section credHelpers répertorie les hôtes Docker Artifact Registry configurés. Les noms d'hôte se terminent par -docker.pkg.dev. L'exemple suivant présente certains hôtes configurés pour l'assistant d'identification gcloud.

"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"
}

Si un hôte que vous souhaitez utiliser ne figure pas dans la liste, exécutez à nouveau l'assistant d'identification pour ajouter l'hôte. Par exemple, la commande suivante ajoute us-east1-docker.pkg.dev.

  • Outil d'aide à la connexion gcloud:

    gcloud auth configure-docker us-east1-docker.pkg.dev
    
  • Assistant d'identification autonome

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

Un jeton d'accès

Pour l'authentification par jeton d'accès, vous devez générer un jeton et l'utiliser comme mot de passe à l'aide de la commande docker login. Les jetons sont valides pendant 60 minutes. Vous devez donc vous authentifier peu avant de taguer, de transférer ou d'extraire des images.

L'exemple suivant génère un jeton d'accès à l'aide de l'emprunt d'identité du compte de service, puis s'authentifie auprès d'Artifact Registry. Vous devez disposer des autorisations du rôle Créateur de jetons du compte de service (roles/iam.serviceAccountTokenCreator) pour générer un jeton de cette manière.

Linux

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

Windows

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

ya29.8QEQIfY_...

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

Si vous n'êtes pas autorisé à emprunter l'identité d'un compte de service, vous pouvez l'activer dans votre session gcloud, puis obtenir un jeton. Pour plus d'informations, consultez les instructions de configuration du jeton d'accès.

Utiliser une clé de compte de service

Pour une clé de compte de service, vous utilisez la clé comme mot de passe avec la commande docker login.

Par exemple, la commande suivante utilise la clé de compte de service encodée en base64 dans le fichier key.json pour s'authentifier auprès de us-east1-docker.pkg.dev.

Linux

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

Windows

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

Pour plus d'informations, consultez les instructions pour configurer l'authentification par clé de compte de service.

Transférer une image

Pour transférer une image locale dans un dépôt Artifact Registry, ajoutez-y un tag avec le nom du dépôt, puis transférez l'image.

Si vous importez des images volumineuses, les limites suivantes s'appliquent:

Heure d'importation
Si vous vous authentifiez auprès d'Artifact Registry à l'aide d'un jeton d'accès, celui-ci n'est valide que pendant 60 minutes. Si vous pensez que votre temps d'importation dépassera 60 minutes, utilisez une autre méthode d'authentification.
Taille d'image
La taille d'artefact maximale est de 5 To.
Artifact Registry n'est pas compatible avec les importations fragmentées Docker. Certains outils permettent d'importer des images volumineuses avec des importations fragmentées ou une importation monolithique. Vous devez utiliser des importations monolithiques pour transférer des images vers Artifact Registry.

Ajouter des tags à l'image locale

  1. Vérifiez que vous êtes authentifié sur le dépôt.

  2. Déterminez le nom de l'image. Le format d'un nom d'image complet est le suivant:

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

    Remplacez les valeurs suivantes :

    • LOCATION est l'emplacement régional ou multirégional du dépôt où l'image est stockée, par exemple us-east1 ou us.

    • PROJECT est l'ID du projet dans Google Cloud Console. Si l'ID du projet contient le signe deux-points (:), consultez la section Projets à l'échelle du domaine.

    • REPOSITORY est le nom du dépôt où l'image est stockée.

    • IMAGE correspond au nom de l'image. Il peut être différent du nom local de l'image.

    Prenons l'exemple d'une image présentant les caractéristiques suivantes :

    • Emplacement du dépôt : us-east1
    • Nom du dépôt : my-repo
    • ID du projet : my-project
    • Nom de l'image locale : my-image
    • Nom de l'image cible : test-image

    Le nom de l'image pour cet exemple est :

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

    Pour en savoir plus sur le format du nom d'image, y compris sur la gestion des projets à l'échelle du domaine, consultez la page Noms des dépôts et des images.

  3. Utilisez la commande suivante pour ajouter un tag à l'image locale avec le nom du dépôt :

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

    SOURCE-IMAGE est le nom ou l'ID de l'image locale.

    Cette commande attribue à l'image son nom de dépôt et lui ajoute le tag latest.

    Pour l'image d'exemple de l'étape précédente, vous devez utiliser la commande suivante si l'image locale my-image se trouve dans le répertoire actuel :

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

    Si vous souhaitez appliquer un tag spécifique, utilisez la commande suivante :

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

    Pour utiliser le tag staging avec l'image de l'exemple, vous devez ajouter :staging à la commande :

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

Transférer l'image taguée vers Artifact Registry

  1. Vérifiez que vous êtes authentifié sur le dépôt.

    Si vous avez utilisé gcloud auth configure-docker ou docker-credential-gcr configure-docker pour configurer le client Docker, vérifiez que le nom d'hôte cible se trouve dans votre fichier de configuration Docker.

  2. Transférez l'image taguée à l'aide de la commande suivante :

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

    Cette commande transfère l'image qui possède le tag latest. Si vous souhaitez transférer une image avec un autre tag, exécutez la commande suivante :

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

Lorsque vous transférez une image, elle est stockée dans le dépôt spécifié.

Après avoir transféré votre image, vous pouvez effectuer les opérations suivantes :

  • Accédez à Cloud Console pour afficher l'image.

  • Exécutez la commande gcloud pour afficher les tags de l'image et le condensé généré automatiquement :

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

    L'exemple de résultat suivant montre des condensés d'images tronqués, mais la commande renvoie toujours le condensé complet de l'image.

     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
    

Extraire des images avec Docker

  1. Vérifiez que vous êtes authentifié sur le dépôt.

    Si vous avez utilisé gcloud auth configure-docker ou docker-credential-gcr configure-docker pour configurer le client Docker, vérifiez que le nom d'hôte cible se trouve dans votre fichier de configuration Docker.

  2. Pour extraire des images d'un dépôt, exécutez la commande suivante :

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

    ou

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

    Remplacez les valeurs suivantes :

    • LOCATION est l'emplacement régional ou multirégional du dépôt où l'image est stockée, par exemple us-east1 ou us.
    • PROJECT est l'ID du projet dans Google Cloud Console. Si l'ID du projet contient le signe deux-points (:), consultez la section Projets à l'échelle du domaine.
    • REPOSITORY est le nom du dépôt où l'image est stockée.
    • IMAGE est le nom de l'image dans le dépôt.
    • TAG est le tag de la version de l'image que vous souhaitez extraire.
    • IMAGE-DIGEST est la valeur de hachage sha256 du contenu de l'image. Chaque version d'une image possède un condensé unique d'image. Dans Google Cloud Console, cliquez sur l'image spécifique pour afficher ses métadonnées. Le condensé y apparaît sous l'intitulé Condensé de l'image.

    Prenons l'exemple d'une image présentant les caractéristiques suivantes :

    • Emplacement du dépôt : us-east1
    • Nom du dépôt : my-repo
    • ID du projet : my-project
    • Nom de l'image : test-image
    • Tag : staging

    L'image permettant d'extraire l'image est la suivante :

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

Extraire des images avec crictl

crictl est un outil de ligne de commande utile pour permettre aux développeurs d'exécution CRI de déboguer leur environnement d'exécution sans avoir à configurer des composants Kubernetes. Si vos nœuds Google Kubernetes Engine utilisent un environnement d'exécution containerd, vous pouvez extraire des images de Artifact Registry à l'aide de crictl.

Puisque crictl est principalement un outil de dépannage, certaines commandes Docker telles que l'envoi ou l'ajout de tags aux images ne sont pas disponibles.

Pour extraire une image depuis Artifact Registry:

  1. Dans Cloud Console, accédez à la page Instances de VM :

    Accéder à la page "Instances de VM"

  2. Connectez-vous en SSH au nœud que vous dépannez.

  3. Obtenir un jeton d'accès pour l'authentification auprès du dépôt

    curl -s "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google"
  4. Extraire l'image à l'aide de crictl pull --creds et de la valeur access_token

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

    ou

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

    La sortie ressemble à ceci :

    Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5

Étape suivante