En esta página se describe cómo enviar y extraer imágenes de contenedor con Docker. También proporciona información sobre cómo extraer imágenes con la herramienta crictl
si tienes problemas en Google Kubernetes Engine.
Para obtener información sobre cómo implementar en entornos de ejecución de Google Cloud , consulta Implementar en Google Cloud.
Para obtener instrucciones sobre cómo listar, etiquetar y eliminar imágenes, consulta Gestionar imágenes.
Antes de empezar
- Si el repositorio de destino no existe, crea uno.
- Debe tener al menos acceso de escritura a Artifact Registry al repositorio.
- Instala Docker si aún no lo has hecho.
Roles obligatorios
Para obtener los permisos que necesitas para enviar y extraer imágenes, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos en el repositorio:
-
Extraer imágenes:
Lector de Artifact Registry (
roles/artifactregistry.reader
) -
Etiqueta y envía imágenes:
Escritor de Artifact Registry (
roles/artifactregistry.writer
)
Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar el acceso a proyectos, carpetas y organizaciones.
También puedes conseguir los permisos necesarios a través de roles personalizados u otros roles predefinidos.
Autenticarse en un repositorio
Debes autenticarte en los repositorios cada vez que uses Docker u otro cliente de terceros con un repositorio de Docker. En esta sección se ofrece un resumen rápido de lo que necesitas para autenticarte correctamente. Para obtener instrucciones detalladas, consulta Configurar la autenticación para Docker.
Usar un auxiliar de credenciales
En el caso del asistente de credenciales de gcloud CLI o del asistente de credenciales independiente, los hosts de Artifact Registry que utilices deben estar en tu archivo de configuración de Docker.
Artifact Registry no añade automáticamente todos los hosts de registro al archivo de configuración de Docker. El tiempo de respuesta de Docker es significativamente más lento cuando hay un gran número de registros configurados. Para minimizar el número de registros del archivo de configuración, añade los hosts que necesites al archivo.
Para confirmar qué hosts están configurados, ejecuta el siguiente comando para mostrar el contenido del archivo de configuración:
- Linux:
cat ~/.docker/config.json
- Windows:
type %USERPROFILE%\.docker\config.json
En la sección credHelpers
se muestran los hosts de Docker de Artifact Registry configurados.
Los nombres de host terminan en -docker.pkg.dev
. En el siguiente ejemplo se muestran algunos hosts configurados para el asistente de credenciales de la CLI de 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 host que quieres usar no está en la lista, vuelve a ejecutar el asistente de credenciales para añadirlo. Por ejemplo, el siguiente comando añade us-west1-docker.pkg.dev
.
Asistente de credenciales de la CLI de gcloud:
gcloud auth configure-docker us-west1-docker.pkg.dev
Asistente de credenciales independiente
docker-credential-gcr configure-docker us-west1-docker.pkg.dev
Usar un token de acceso
Para la autenticación con token de acceso, genera un token y úsalo como contraseña
con el comando docker login
. Los tokens son válidos durante 60 minutos, por lo que debes autenticarte poco antes de etiquetar, enviar o extraer imágenes.
En el siguiente ejemplo se genera un token de acceso mediante la suplantación de identidad de una cuenta de servicio y, a continuación, se autentica en Artifact Registry. Debes tener permisos en el rol Creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator
) para generar un token de esta forma.
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 no tienes permisos para suplantar la identidad de una cuenta de servicio, puedes activar la cuenta de servicio en tu sesión de la CLI de gcloud y, a continuación, obtener un token. Para obtener más información, consulta las instrucciones para configurar la autenticación con tokens de acceso.
Usar una clave de cuenta de servicio
En el caso de una clave de cuenta de servicio, se usa como contraseña con el comando docker login
.
Por ejemplo, el siguiente comando usa la clave de cuenta de servicio codificada en Base64 del archivo key.json
para autenticarse en us-west1-docker.pkg.dev
.
Linux
cat key.json | docker login -u _json_key_base64 --password-stdin \
https://us-west1-docker.pkg.dev
Windows
docker login -u _json_key_base64 --password-stdin https://us-west1-docker.pkg.dev < key.json
Para obtener más información, consulta las instrucciones para configurar la autenticación con clave de cuenta de servicio.
Insertar una imagen
Modos de repositorio: estándar
Para enviar una imagen local a un repositorio estándar de Docker, etiquétala con el nombre del repositorio y, a continuación, envía la imagen.
Si la inmutabilidad de etiquetas está habilitada en tu repositorio de Docker de Artifact Registry, una etiqueta siempre debe hacer referencia al mismo digest de imagen del repositorio. No puedes usar la etiqueta en otra versión de la misma imagen que subas al repositorio. Para obtener más información sobre los resúmenes de imágenes, las etiquetas y la inmutabilidad de las etiquetas, consulta Versiones de imágenes de contenedor.
En el caso de las imágenes grandes, se aplican los siguientes límites:
- Hora de subida
- Si te autenticas en Artifact Registry con un token de acceso, el token solo será válido durante 60 minutos. Si crees que el tiempo de subida será superior a 60 minutos, usa otro método de autenticación.
- Tamaño de la imagen
- El tamaño máximo de los artefactos es de 5 TB.
- Artifact Registry no admite subidas fragmentadas de Docker. Algunas herramientas permiten subir imágenes de gran tamaño mediante subidas en fragmentos o con una sola subida monolítica. Debes usar subidas monolíticas para enviar imágenes a Artifact Registry.
Etiquetar la imagen local
Asegúrate de que te hayas autenticado en el repositorio.
Determina el nombre de la imagen. El formato de un nombre de imagen completo es el siguiente:
LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE
Sustituye los siguientes valores:
LOCATION
es la ubicación regional o multirregional del repositorio donde se almacena la imagen.PROJECT-ID
es el ID del proyecto de tu consola. Google Cloud Si el ID de tu proyecto contiene dos puntos (:
), consulta Proyectos con ámbito de dominio.REPOSITORY
es el nombre del repositorio en el que se almacena la imagen.IMAGE
es el nombre de la imagen. Puede ser diferente del nombre local de la imagen.
Por ejemplo, supongamos que tienes una imagen con las siguientes características:
- Ubicación del repositorio:
us-west1
- Nombre del repositorio:
my-repo
- ID del proyecto:
my-project
- Nombre de la imagen local:
my-image
- Nombre de la imagen de destino:
test-image
El nombre de la imagen de este ejemplo es:
us-west1-docker.pkg.dev/my-project/my-repo/test-image
Para obtener información sobre el formato del nombre de la imagen, incluido el tratamiento de los proyectos con ámbito de dominio, consulta Nombres de repositorios e imágenes.
Etiqueta la imagen local con el nombre del repositorio.
docker tag SOURCE-IMAGE LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE:TAG
Sustituye SOURCE-IMAGE por el nombre o el ID de la imagen local y TAG por la etiqueta. Si no especifica ninguna etiqueta, Docker aplica la etiqueta
latest
predeterminada.Si el ajuste de etiquetas de imagen inmutables está habilitado, las etiquetas deben ser únicas para cada versión de la imagen, incluida la etiqueta
latest
. No puedes enviar una imagen al repositorio si la etiqueta ya la usa otra versión de la misma imagen en el repositorio. Para comprobar si el ajuste está habilitado en el repositorio, ejecuta el comando:gcloud artifacts repositories describe REPOSITORY \ --project=PROJECT-ID \ --location=LOCATION
En el caso de la imagen de ejemplo del paso anterior, usarías el siguiente comando si la imagen local
my-image
se encuentra en el directorio actual:docker tag my-image us-west1-docker.pkg.dev/my-project/my-repo/test-image
Si quieres aplicar una etiqueta específica, usa el siguiente comando:
docker tag SOURCE-IMAGE LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE:TAG
Para usar la etiqueta
staging
con la imagen de ejemplo, añade:staging
al comando:docker tag my-image us-west1-docker.pkg.dev/my-project/my-repo/test-image:staging
Envía la imagen etiquetada a Artifact Registry
Asegúrate de que te hayas autenticado en el repositorio.
Si has usado
gcloud auth configure-docker
odocker-credential-gcr configure-docker
para configurar tu cliente Docker, comprueba que el nombre de host de destino esté en tu archivo de configuración de Docker.Envía la imagen etiquetada con el comando:
docker push LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE
Este comando envía la imagen que tiene la etiqueta
latest
. Si quieres enviar una imagen que tenga una etiqueta diferente, usa el comando:docker push LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE:TAG
Cuando envías una imagen, se almacena en el repositorio especificado.
Después de enviar la imagen, puedes hacer lo siguiente:
Ve a la Google Cloud consola para ver la imagen.
Ejecuta el comando
gcloud
para ver las etiquetas de la imagen y el digest generado automáticamente:gcloud artifacts docker images list \ LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY/IMAGE [--include-tags]
En el siguiente ejemplo de resultado se muestran resúmenes de imágenes truncados, pero el comando siempre devuelve el resumen de imagen completo.
IMAGE DIGEST CREATE_TIME UPDATE_TIME us-west1-docker.pkg.dev/my-project/my-repo/my-image sha256:85f... 2019-04-10T15:08:45 2019-04-10T15:08:45 us-west1-docker.pkg.dev/my-project/my-repo/my-image sha256:238... 2019-04-10T17:23:53 2019-04-10T17:23:53 us-west1-docker.pkg.dev/my-project/my-repo/my-image sha256:85f... 2019-04-10T15:08:46 2019-04-10T15:08:46
Extraer imágenes con Docker
Modos de repositorio: estándar, remoto y virtualAsegúrate de que te hayas autenticado en el repositorio.
Si has usado
gcloud auth configure-docker
odocker-credential-gcr configure-docker
para configurar tu cliente Docker, comprueba que el nombre de host de destino esté en tu archivo de configuración de Docker.Para extraer contenido de un repositorio, usa el 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
Sustituye los siguientes valores:
LOCATION
es la ubicación regional o multirregional del repositorio donde se almacena la imagen.PROJECT
es el ID del proyecto de tu consola. Google Cloud Si el ID de tu proyecto contiene dos puntos (:
), consulta Proyectos con ámbito de dominio.PROJECT
es el ID del proyecto de tu consola. Google CloudREPOSITORY
es el nombre del repositorio en el que se almacena la imagen.IMAGE
es el nombre de la imagen en el repositorio.TAG
es la etiqueta de la versión de la imagen que quieres extraer.IMAGE-DIGEST
es el valor de hash sha256 del contenido de la imagen. Cada versión de una imagen tiene una síntesis de imagen única. En la Google Cloud consola, haz clic en la imagen específica para ver sus metadatos. El resumen se indica como Resumen de la imagen.
Por ejemplo, supongamos que tienes una imagen con las siguientes características:
- Ubicación del repositorio:
us-west1
- Nombre del repositorio:
my-repo
- ID del proyecto:
my-project
- Nombre de la imagen:
test-image
- Etiqueta:
staging
El comando para descargar la imagen es el siguiente:
docker pull us-west1-docker.pkg.dev/my-project/my-repo/test-image:staging
Docker descarga la imagen especificada.
Si solicitas una imagen de un repositorio remoto, el repositorio remoto descarga y almacena en caché la imagen de la fuente upstream si no existe una copia en caché.
Si solicitas una imagen de un repositorio virtual, Artifact Registry busca la imagen solicitada en los repositorios upstream. Si solicita una versión que está disponible en más de un repositorio upstream, Artifact Registry elige un repositorio upstream que se va a usar en función de los ajustes de prioridad configurados para el repositorio virtual.
Por ejemplo, supongamos que tiene un repositorio virtual con los siguientes ajustes de prioridad para los repositorios upstream:
main-repo
: prioridad definida como100
secondary-repo1
: prioridad establecida en80
.secondary-repo2
: prioridad establecida en80
.test-repo
: prioridad establecida en20
.
main-repo
tiene el valor de prioridad más alto, por lo que el repositorio virtual siempre lo busca primero.
Tanto secondary-repo1
como secondary-repo2
tienen la prioridad 80
. Si una imagen solicitada no está disponible en main-repo
, Artifact Registry busca en estos repositorios. Como ambos tienen el mismo valor de prioridad, Artifact Registry puede elegir servir una imagen de cualquiera de los dos repositorios si la versión está disponible en ambos.
test-repo
tiene el valor de prioridad más bajo y servirá un artefacto almacenado si ninguno de los otros repositorios upstream lo tiene.
Obtener imágenes con crictl
crictl
es una herramienta de línea de comandos útil para que los desarrolladores de tiempos de ejecución de CRI depuren su tiempo de ejecución sin necesidad de configurar componentes de Kubernetes. Si tus nodos de Google Kubernetes Engine usan un tiempo de ejecución containerd, puedes extraer imágenes de Artifact Registry con crictl
.
Como crictl
es principalmente una herramienta para solucionar problemas, algunos comandos de Docker, como
enviar o etiquetar imágenes, no están disponibles.
Para extraer una imagen de Artifact Registry, sigue estos pasos:
En la consola de Google Cloud , ve a la página Instancias de VM.
Conéctate por SSH al nodo en el que estás solucionando el problema.
Obtén un token de acceso para autenticarte en el repositorio.
curl -s "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google"
Extrae la imagen con
crictl pull --creds
y el valoraccess_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
La salida tiene este aspecto:
Image is up to date for sha256:0f25067aa9c180176967b4b50ed49eed096d43fa8c17be9a5fa9bff05933bee5
Siguientes pasos
- Consulta información sobre cómo gestionar etiquetas y eliminar imágenes.
- Si quieres ejecutar contenedores en Compute Engine, consulta información sobre los contenedores en Compute Engine.
- Usar
crictl
para depurar nodos de Kubernetes - Aprende a usar
crictl
para extraer imágenes de repositorios privados de Artifact Registry. - Consulta más información sobre cómo configurar
crictl
registros de imágenes.