En este documento, se explican las diferencias entre Container Registry y Artifact Registry cuando se compilan imágenes de contenedor con Cloud Build y se implementan en Google Cloud entornos de ejecución, como Cloud Run o Google Kubernetes Engine.
En esta guía, las comparaciones se centran en los repositorios estándares de Artifact Registry, que son independientes de Container Registry y admiten todas las funciones de Artifact Registry. Si tu
administrador configuró
repositorios con compatibilidad con dominios gcr.io, las solicitudes
a los 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 obtener información sobre 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 los comandos, la configuración o la documentación existentes enfocados en Container Registry con Cloud Build.
Antes de comenzar
En este documento, se supone que ya tienes lo siguiente:
- Habilitaste Artifact Registry en tu proyecto.
- Habilitaste la API de Cloud Build y la API de cualquier otro servicio Google Cloud que uses con Artifact Registry.
Cambios en el flujo de trabajo
Cuando usas Cloud Build con Container Registry en el mismo proyecto, el flujo de trabajo se ve de la siguiente manera:
Compila, etiqueta y envía una imagen al repositorio con Cloud Build con un
Dockerfile
o un archivo de configuración de compilación.En el siguiente ejemplo, se compila la imagen
my-image
, se etiqueta contag1
y se envía al hostgcr.io
en el proyectomy-project
:gcloud builds submit --tag gcr.io/my-project/my-image:tag1
LosGoogle Cloud entorno de ejecución, como Cloud Run y Google Kubernetes Engine, extraen imágenes del registro.
Por ejemplo, este comando implementa la imagen del paso anterior en 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 la compilación y la implementación.
- Cuando habilitas algunas APIs 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 la cuenta puede agregar automáticamente hosts de Container Registry a un proyecto la primera 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 incluye vínculos a información adicional para 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 aún no existe. 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.
Cambió: Compila, etiqueta y envía una imagen al repositorio con Cloud Build, usando un
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 Google Cloud entorno de ejecución, como Cloud Run o GKE.
El siguiente comando de ejemplo es el mismo que el 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 a 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 un proyecto diferente al de Artifact Registry.
- Usas cuentas de servicio personalizadas para Google Cloud servicios como Cloud Build o GKE en lugar de las cuentas de servicio predeterminadas.
- 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 de otros Google Cloud servicios, 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 análisis 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 deGoogle 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 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 sola multirregión en el mismo 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, una cuenta con el rol de 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
, enviar la imagengcr.io/my-project/my-image:1.0
activa los siguientes 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 necesarios para crear un bucket de almacenamiento, por lo que no se pueden distinguir el envío inicial de imágenes y los envíos posteriores.
Dentro de un proyecto, un host de registro almacena todas las imágenes en el mismo bucket de almacenamiento. 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 rol de administrador del repositorio de Artifact Registry debe crear el repositorio 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 las 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 deGoogle Cloud tienen acceso de lectura o escritura equivalente a
Artifact Registry y Container Registry. Sin embargo, la cuenta de servicio predeterminada
de Cloud Build no puede crear repositorios estándar
en el dominio
pkg.dev
. - Otorga los roles de Artifact Registry adecuados 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 en el rol de Administrador de almacenamiento para agregar hosts de Container Registry a un proyecto.
- Visualizador de objetos de almacenamiento a nivel del bucket de almacenamiento
- Extrae (lee) imágenes de los hosts de registro existentes en el proyecto.
- Escritor de depósitos heredados de Storage 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 del proyecto
- Envía una imagen inicial al host para agregar un host de registro a un proyecto.
Después del envío inicial de la imagen a un registro, otorgas roles de Cloud Storage a otras cuentas que requieren acceso al bucket de almacenamiento. Ten en cuenta que cualquier cuenta con todos los permisos del rol de administrador de almacenamiento puede leer, escribir y borrar buckets y objetos de almacenamiento en 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 usuario del administrador y del repositorio.
Cloud Build tiene permisos en el rol de escritor de Artifact Registry, ya que solo necesita enviar 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 artefactos.
- Escritor de Artifact Registry
- Enumera artefactos y 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.
Cómo compilar y enviar 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 de Container Registry.
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 Google Cloud proyecto. Para este envío inicial de imágenes, Cloud Build tiene permisos para agregar automáticamente el host del 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 de las imágenes en tu archivo de configuración de compilación o en los comandos
gcloud builds submit
.
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 de las imágenes en la configuración de la implementación y en los 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 acceso de Container Registry para las imágenes que implementes con la ruta de acceso a un repositorio de Artifact Registry existente.
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 acceso de Container Registry para las imágenes que compilas con la ruta de acceso a un repositorio de Artifact Registry existente.
En los siguientes ejemplos de Artifact Registry, se usa la imagen de muestra us-docker.pkg.dev/google-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/google-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/google-samples/containers/gke/hello-app:1.0