En este documento, se explican las diferencias entre Container Registry y Artifact Registry cuando se compilan imágenes de contenedores con Cloud Build y se implementan en entornos de ejecución de Google Cloud, como Cloud Run o Google Kubernetes Engine.
En esta guía, las comparaciones se enfocan en Artifact Registry estándar
repositorios, repositorios normales de Artifact Registry que son independientes
de Container Registry
y son compatibles con todas las funciones de Artifact Registry. Si tu
administrador configuró
repositorios con compatibilidad con dominios gcr.io, las solicitudes
a nombres de host gcr.io
se redireccionan automáticamente a un repositorio
de Artifact Registry correspondiente, y las cuentas de servicio predeterminadas que tienen acceso
a Container Registry tienen permisos predeterminados equivalentes para Artifact Registry.
Para conocer las diferencias entre Container Registry y Artifact Registry con un cliente de Docker, consulta Cambios en el envío y la extracción con Docker.
Usa esta información para adaptar tus comandos, configuraciones o sobre Container Registry con Cloud Build.
Antes de comenzar
En este documento, se supone que ya hiciste lo siguiente:
- Habilitaste Artifact Registry en tu proyecto.
- Habilitaste la API de Cloud Build y la API de cualquier otro servicio de Google Cloud que uses con Artifact Registry.
Cambios en el flujo de trabajo
Cuando usas Cloud Build con Container Registry dentro del mismo proyecto, el flujo de trabajo se ve así:
Crear, etiquetar y enviar una imagen al repositorio con Cloud Build con
Dockerfile
o un archivo de configuración de compilaciónEn el siguiente ejemplo, se compila la imagen
my-image
, la etiqueta contag1
y lo envía al hostgcr.io
en el proyectomy-project
:gcloud builds submit --tag gcr.io/my-project/my-image:tag1
entornos de ejecución de Google Cloud, como Cloud Run Google Kubernetes Engine extrae imágenes del registro.
Por ejemplo, este comando implementa la imagen del paso anterior para Cloud Run como
my-service
.gcloud run deploy my-service --image gcr.io/my-project/my-image:tag1
El flujo de trabajo de Container Registry combina las responsabilidades del administrador con en la creación y la implementación.
- Cuando habilitas algunas APIs de Google Cloud, la API de Container Registry se habilita automáticamente. Esto significa que los usuarios de estos servicios tienen acceso implícito a Container Registry en el mismo proyecto. Por ejemplo, los usuarios que pueden ejecutar compilaciones en Cloud Build pueden enviar imágenes a registros y agregar hosts de registro de forma predeterminada.
- La cuenta de servicio de Cloud Build tiene permisos para crear buckets de almacenamiento de Cloud Storage. Esto significa que el puede agregar automáticamente hosts de Container Registry a un proyecto la primera cada vez que envía una imagen al host. También significa que la cuenta puede crear, leer y escribir en buckets de almacenamiento en todo el proyecto, incluidos los buckets que no usa Container Registry.
En Artifact Registry, hay una clara separación de los roles de administrador y de compilación que cambia los pasos del flujo de trabajo de compilación e implementación. Para adaptar el flujo de trabajo de Container Registry para Artifact Registry, realiza los siguientes cambios. Cada paso se vincula a información adicional sobre cómo modificar el flujo de trabajo.
Nuevo: Habilita la API de Artifact Registry.
Debes habilitar la API de Artifact Registry. Cloud Build y los entornos de ejecución, como Cloud Run y GKE, no habilitan automáticamente la API por ti.
Nuevo: Crea el repositorio de Docker de destino si no lo tiene. ya existen. Debes crear un repositorio para poder enviarle imágenes. El envío de una imagen no activa la creación de un repositorio y la cuenta de servicio de Cloud Build no tiene permisos para crear repositorios.
Modificado: Compila, etiqueta y envía una imagen al repositorio. con Cloud Build mediante
Dockerfile
o un archivo de configuración de compilación.El siguiente comando de ejemplo es el mismo que el de Container Registry, pero usa una ruta de acceso del repositorio de Artifact Registry para la imagen.
gcloud builds submit --tag us-central1-docker.pkg.dev/my-project/my-repo/my-image:tag1
Cambió: Implementa la imagen en un entorno de tiempo de ejecución de Google Cloud, como Cloud Run o GKE.
El siguiente comando de ejemplo es el mismo que el ejemplo de Container Registry, pero usa la ruta de acceso del repositorio de Artifact Registry para la imagen.
gcloud run deploy my-service --image us-central1-docker.pkg.dev/my-project/my-repo/my-image:tag1
Además, Artifact Registry usa roles diferentes de los de Container Registry para controlar el acceso a las imágenes. Debes configurar los permisos en las siguientes situaciones:
- Los entornos de ejecución de Cloud Build o Google Cloud están en proyecto diferente al de Artifact Registry.
- Usas cuentas de servicio personalizadas para servicios de Google Cloud, como Cloud Build o GKE en lugar del servicio predeterminado cuentas de servicio.
- Otorgaste permisos a otros usuarios o cuentas de servicio.
Habilitar la API
Puntos clave:
- Debes habilitar la API de Artifact Registry además de la API para otros servicios de Google Cloud, como Cloud Build, Cloud Run y GKE.
En la siguiente comparación, se describe cómo habilitar la API para cada servicio:
Container Registry
Cuando habilitas las siguientes APIs de Google Cloud, la API de Container Registry también se habilita automáticamente:
- Entorno flexible de App Engine
- Cloud Build
- Funciones de Cloud Run
- Cloud Run
- Análisis de contenedores o a pedido en Artifact Analysis
- Google Kubernetes Engine
Con los permisos predeterminados, los usuarios que pueden ejecutar compilaciones en Cloud Build, scanear contenedores con Artifact Analysis o implementar contenedores en entornos de ejecución de Google Cloud tienen acceso implícito a las imágenes en Container Registry cuando el registro está en el mismo proyecto.
Artifact Registry
Debes habilitar la API de Artifact Registry. Servicios como Cloud Build, Cloud Run y GKE no habilitan automáticamente la API de Artifact Registry.
Puedes habilitar varias APIs en el mismo proyecto con gcloud. Por ejemplo, para habilitar la API de Cloud Build y la En la API de Artifact Registry, ejecuta el siguiente comando:
gcloud services enable
artifactregistry.googleapis.com \
cloudbuild.googleapis.com
Cómo agregar registros y repositorios
Puntos clave:
- Debes crear un repositorio de Docker de Artifact Registry antes de enviarle una imagen.
- Container Registry almacena todas las imágenes en una única multirregión en la misma bucket de almacenamiento. En Artifact Registry, puedes crear varios repositorios en la misma región o en varias regiones con políticas de acceso independientes.
En la siguiente comparación, se describe la configuración del repositorio en cada servicio:
Container Registry
En Container Registry, puedes agregar hasta cuatro hosts de registro a tu proyecto. Para agregar un host de registro, envía la primera imagen.
Para agregar un registro como
gcr.io
a tu proyecto, debes tener una cuenta con el El rol Administrador de almacenamiento a nivel del proyecto envía una imagen inicial.Por ejemplo, si el host
gcr.io
no existe en el proyectomy-project
, cuando se envía la imagengcr.io/my-project/my-image:1.0
, se activa sigue estos pasos:- Agrega el host
gcr.io
al proyecto - Crea un bucket de almacenamiento para
gcr.io
en el proyecto. - Almacena la imagen como
gcr.io/my-project/my-image:1.0
- Agrega el host
Después de esta publicación inicial, puedes otorgar permisos al bucket de almacenamiento para otros usuarios.
De forma predeterminada, Cloud Build tiene los permisos permisos para crear un bucket de almacenamiento, de modo que el envío inicial de la imagen no se pueden distinguir.
Dentro de un proyecto, un host de registro almacena todas las imágenes en el mismo almacenamiento
bucket. En el siguiente ejemplo, el proyecto my-project
tiene dos imágenes llamadas
web-app
en el registro gcr.io
. Uno está directamente debajo del ID del proyecto.
my-project
La otra imagen está en el repositorio team1
.
gcr.io/my-project/web-app
gcr.io/my-project/team1/web-app
Artifact Registry
Cloud Build no tiene permisos para crear un repositorio estándar
en el dominio pkg.dev
de Artifact Registry.
Una cuenta con el repositorio de Artifact Registry El rol de administrador debe crear la en un repositorio específico antes de enviarle imágenes. Luego, puedes otorgar permisos al repositorio para otros usuarios
En Artifact Registry, cada repositorio es un recurso independiente. Por lo tanto, Todas las rutas de acceso a imágenes deben incluir un repositorio.
Rutas de acceso de imágenes válidas:
us-central1-docker.pkg.dev/my-project/team1/web-app:1.0
us-central1-docker.pkg.dev/my-project/team2/web-app:1.0
Ruta de imagen no válida (no incluye un repositorio):
us-central1-docker.pkg.dev/my-project/web-app:1.0
En los siguientes ejemplos, se muestran situaciones en las que falla el envío de una imagen a un repositorio que no está disponible.
- Envía una imagen a
us-central1-docker.pkg.dev/my-project/team1
sius-central1-docker.pkg.dev/my-project/team1
no existe. - Envía una imagen a
us-central1-docker.pkg.dev/my-project/team2
cuando existeus-central1-docker.pkg.dev/my-project/team1
, pero no existeus-central1-docker.pkg.dev/my-project/team2
.
Otorgando permisos
Puntos clave:
- Los servicios de Google Cloud tienen acceso de lectura o escritura equivalente a ambos
Container Registry y Artifact Registry. Sin embargo, la configuración predeterminada
La cuenta de servicio de Cloud Build no puede crear repositorios estándar
en el dominio
pkg.dev
. - Otorga los roles adecuados de Artifact Registry a otras cuentas que accedan a Artifact Registry.
- Container Registry admite el control de acceso a nivel del bucket de almacenamiento. Artifact Registry admite el control de acceso a nivel del repositorio.
En la siguiente comparación, se describen los permisos de cada servicio:
Container Registry
Container Registry usa los roles de Cloud Storage para controlar el acceso. Cloud Build tiene los permisos necesarios para agregar hosts de Container Registry a un proyecto.
- Visualizador de objetos de Storage a nivel del bucket de almacenamiento
- Extrae (lee) imágenes de los hosts de registro existentes en el proyecto.
- Escritor de buckets heredados de almacenamiento a nivel del bucket de almacenamiento
- Envía (escribe) y extrae (lee) imágenes para los hosts de registro existentes en el proyecto.
- Administrador de almacenamiento a nivel de proyecto
- Envía una imagen inicial al host para agregar un host de registro a un proyecto.
Luego del envío de la imagen inicial a un registro, otorgas roles de Cloud Storage a otras cuentas que requieran acceso al bucket de almacenamiento. Ten en cuenta que cualquier con todos los permisos del rol de administrador de almacenamiento puede leer, escribir borrar buckets de almacenamiento y objetos de almacenamiento de todo el proyecto.
Los permisos de un bucket de almacenamiento se aplican a todos los repositorios del registro.
Por ejemplo, cualquier usuario con permisos de Visualizador de objetos de almacenamiento en el bucket de gcr.io/my-project
puede leer imágenes en todos estos repositorios:
gcr.io/my-project/team1
gcr.io/my-project/team2
gcr.io/my-project/test
gcr.io/my-project/production
Artifact Registry
Artifact Registry tiene sus propios roles para controlar el acceso. Estos roles proporcionan una separación clara entre los roles de los usuarios del repositorio y los de administrador.
Cloud Build tiene permisos
en el rol de escritor de Artifact Registry, ya que solo necesita
y extraer imágenes con repositorios estándar en el dominio pkg.dev
.
Solo las cuentas que administran repositorios deben tener el rol de Administrador del repositorio de Artifact Registry o de Administrador de Artifact Registry.
- Lector de Artifact Registry
- Enumera artefactos y repositorios. Descarga los artefactos.
- Escritor de Artifact Registry
- Enumera los artefactos y los repositorios. Descarga artefactos, sube versiones de artefactos nuevas y agrega o actualiza etiquetas.
- Administrador del repositorio de Artifact Registry
- Permisos de escritor de Artifact Registry y permisos para borrar artefactos y etiquetas.
- Administrador de Artifact Registry
- Permisos del administrador del repositorio de Artifact Registry y permisos para crear, actualizar, borrar y otorgar permisos a los repositorios.
Puedes aplicar estos permisos a nivel del repositorio. Por ejemplo:
- Otorga acceso al equipo 1 para
us-central1-docker.pkg.dev/my-project/team1
- Otorgar acceso a
us-central1-docker.pkg.dev/my-project/team2
al equipo 2
Para obtener detalles sobre cómo otorgar permisos de Artifact Registry, consulta la documentación sobre control de acceso.
Compila y envía imágenes
Puntos clave:
- Debes crear un repositorio de Docker de Artifact Registry antes de enviarle una imagen.
- Los nombres de host de Artifact Registry son diferentes de los nombres de host de Container Registry y los nombres de host.
Cloud Build puede compilar, etiquetar y enviar una imagen en un solo paso.
Con Container Registry, Cloud Build puede enviar correctamente una imagen a un host de registro que aún no existe en el proyecto de Google Cloud. Para este envío de imagen inicial, Cloud Build tiene permisos para agregar el host de registro al proyecto.
Para adaptar un flujo de trabajo de Container Registry, haz lo siguiente:
- Configura tus repositorios antes de enviarles imágenes.
- Actualiza las rutas de acceso a las imágenes en tu archivo de configuración de compilación, o en
gcloud builds submit
con comandos de SQL sencillos.
Compila con un archivo de configuración de compilación
Reemplaza las rutas de acceso de Container Registry para las imágenes que compilas con la ruta de acceso a un repositorio de Artifact Registry existente.
En el siguiente ejemplo de archivo cloudbuild.yaml
, se compila la imagen us-central1-docker.pkg.dev/my-project/my-repo/my-image:tag1
:
steps:
- name: 'gcr.io/cloud-builders/docker'
args: [ 'build', '-t', 'us-central1-docker.pkg.dev/my-project/my-repo/my-image:tag1', '.' ]
images:
- 'us-central1-docker.pkg.dev/my-project/my-repo/my-image:tag1'
Luego, puedes compilar la imagen con el siguiente comando:
gcloud builds submit --config cloudbuild.yaml
Compila con un Dockerfile
Reemplaza las rutas de acceso de Container Registry para las imágenes que compilas con la ruta de acceso a un repositorio de Artifact Registry existente.
En el siguiente comando de ejemplo, se compila la imagen us-central1-docker.pkg.dev/my-project/my-repo/my-image:tag1
con un Dockerfile
en el directorio actual:
gcloud builds submit --tag us-central1-docker.pkg.dev/my-project/my-repo/my-image:tag1
Implementa imágenes
Punto clave:
- Los nombres de host de Artifact Registry son diferentes de los de Container Registry.
Para adaptar un flujo de trabajo de Container Registry, actualiza las rutas de acceso a imágenes en tu implementación configuración y comandos de implementación. En las siguientes secciones, se muestran ejemplos de Cloud Build, Cloud Run y GKE, pero el mismo enfoque se aplica a cualquier otro servicio de Google Cloud que implemente imágenes.
Cloud Build
Reemplaza las rutas de Container Registry para las imágenes que implementes con el a un repositorio existente de Artifact Registry.
En el siguiente ejemplo de archivo cloudbuild.yaml
, se implementa la imagen de ejemplo us-docker.pkg.dev/cloudrun/container/hello
.
steps:
- name: 'gcr.io/cloud-builders/gcloud'
args:
- 'run'
- 'deploy'
- 'cloudrunservice'
- '--image'
- 'us-docker.pkg.dev/cloudrun/container/hello'
- '--region'
- 'us-central1'
- '--platform'
- 'managed'
- '--allow-unauthenticated'
Cloud Run
Reemplaza las rutas de acceso de Container Registry para las imágenes que implementes con la ruta de acceso a un repositorio de Artifact Registry existente.
Por ejemplo, este comando implementa la imagen de muestra
us-docker.pkg.dev/cloudrun/container/hello
gcloud run deploy my-service --image us-docker.pkg.dev/cloudrun/container/hello
GKE
Reemplaza las rutas de Container Registry para las imágenes que compiles con el a un repositorio existente de Artifact Registry.
En los siguientes ejemplos de Artifact Registry, se usa la imagen de muestra us-docker.pkg.dev/artifact-registry-samples/containers/gke/hello-app:1.0
.
Crea un clúster desde la línea de comandos:
kubectl create deployment hello-server --image=us-docker.pkg.dev/artifact-registry-samples/containers/gke/hello-app:1.0
Especifica una imagen en un manifiesto de implementación:
In a deployment manifest:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
run: my-app
template:
metadata:
labels:
run: my-app
spec:
containers:
- name: hello-app
image: us-docker.pkg.dev/artifact-registry-samples/containers/gke/hello-app:1.0