En esta sección, se explica cómo solucionar problemas comunes de Container Registry y Docker.
Proyectos con alcance de dominio
Si recibes el error invalid reference format
, es posible que tengas un proyecto con alcance de dominio.
Si tu proyecto tiene alcance para tu dominio, entonces, el ID del proyecto incluye el dominio y dos puntos, por ejemplo: example.com:my-project
. Consulta la sección Proyectos con alcance de dominio para saber cómo trabajar con los ID de proyectos que incluyen un dominio.
Error: Estado 405: v1 Registry API is disabled.
Si experimentas continuamente un error como "La API de Registry v1 está inhabilitada" cuando extraes o envías imágenes, asegúrate de que el nombre de host, el ID del proyecto, el nombre de la imagen y la etiqueta o resumen estén escritos de forma correcta.
Para ver las etiquetas y el resumen de tu imagen, ejecuta el siguiente comando:
gcloud container images list-tags [HOSTNAME]/[PROJECT-ID]/[IMAGE]
Por ejemplo:
gcloud container images list-tags gcr.io/my-project/my-image
Para obtener más información sobre cómo generar listas de etiquetas y resúmenes de imágenes, consulta Gestionar imágenes.
Problemas con los permisos
En las siguientes secciones, se describen soluciones para problemas específicos de permisos. Asegúrate siempre de tener los permisos necesarios para enviar o extraer imágenes. Consulta Permisos y funciones.
Problemas de permisos relacionados con el acceso uniforme a nivel de bucket
Si habilitaste el acceso uniforme a nivel de depósito en un depósito de almacenamiento que utiliza Container Registry, es posible que tengas problemas de acceso para enviar y extraer contenido en Container Registry.
A fin de solucionar los problemas de acceso, asegúrate de tener los permisos necesarios para enviar o extraer contenido. Estos permisos se enumeran en Permisos y funciones.
Problemas de permisos relacionados con la configuración de Docker en tu máquina local
Si experimentas un error permission denied
, como el siguiente ejemplo:
FATA[0000] Post http://var/run/docker.sock/v1.17/images/gcr.io/container-engine-docs/example/push?tag=: dial unix /var/run/docker.sock: permission denied
ERROR: (gcloud.docker) A Docker command did not run successfully.
Tried to run: 'docker push gcr.io/container-engine-docs/example'
Exit code: 1
Es posible que debas agregarte al grupo de usuarios docker
.
Ejecuta el siguiente comando en el shell o la ventana de la terminal:
sudo usermod -a -G docker ${USER}
Reinicia el sistema después de agregarte al grupo de usuarios docker
.
Problemas de permisos cuando te comunicas con Container Registry
Si detectas un error de permiso como el siguiente:
Permission denied: Unable to create the repository, please check that you have access to do so
Verifica que la facturación esté habilitada para tu proyecto.
Verifica tu acceso:
Ejecuta el siguiente comando a fin de asegurarte de que estás autenticado para
gcloud
:gcloud init
Ejecuta el siguiente comando a fin de asegurarte de que Docker esté configurado para usar
gcloud
como asistente de credenciales de Container Registry:gcloud auth configure-docker
Verifica que se puede ejecutar
docker-credential-gcloud
:docker-credential-gcloud list
Deberías ver un objeto JSON con su registro de destino como una de sus claves. Por ejemplo:
{ "https://asia.gcr.io": "oauth2accesstoken", "https://eu.gcr.io": "oauth2accesstoken", "https://gcr.io": "oauth2accesstoken", "https://us.gcr.io": "oauth2accesstoken" }
A continuación, comprueba si tienes permiso para escribir en Cloud Storage en el proyecto al que intentas acceder. De lo contrario, pídele a un administrador que le otorgue acceso a tu usuario y vuelve a intentarlo.
Si el problema persiste después de obtener el permiso correcto, es posible que tu token de acceso se obtenga sin uno de estos permisos:
https://www.googleapis.com/auth/devstorage.read_write
https://www.googleapis.com/auth/devstorage.full_control
Para verificarlo, primero obtén el token de acceso. Este varía de una aplicación a otra, por ejemplo, si usas un token de acceso de una cuenta de servicio predeterminada de Compute Engine, puedes seguir estas instrucciones para obtenerlo.
Una vez que obtengas el token de acceso, puedes usar este comando a fin de ver los permisos que se usaron para obtenerlo:
curl -H "Authorization: Bearer <your access token>" https://www.googleapis.com/oauth2/v1/tokeninfo
En caso de que no se incluyan los permisos mencionados, soluciona el problema para asegurarte de incluirlos cuando obtengas el token de acceso en tu código. Por ejemplo, en el caso de los tokens generados específicamente para la cuenta de servicio predeterminada de tu máquina virtual de Compute Engine, deberás corregir la configuración de permisos para esa máquina virtual y volver a crearla.
Problemas de permisos para enviar y extraer imágenes
La instancia de VM que envía o extrae imágenes debe configurarse correctamente con los permisos de IAM y los permisos de acceso necesarios para acceder al bucket de almacenamiento de Container Registry. Si deseas obtener información acerca de la configuración requerida, consulta Cómo usar Container Registry con Google Cloud.
Error ImagePullBackoff de Google Kubernetes Engine
GKE muestra un error ImagePullBackoff
cuando no puede extraer una imagen de un registro. Es posible que el error se produzca porque no se puede encontrar la imagen o porque tus nodos no tienen permisos para extraer del registro. De forma predeterminada, los nodos de GKE tienen permisos para extraer imágenes de Container Registry cuando el registro está en el mismo proyecto de Google Cloud que tus nodos.
La documentación de GKE incluye pasos para identificar la causa raíz y resolver el problema.
Aplicación de políticas de la organización
Las restricciones de las políticas de la organización pueden afectar el uso de Container Registry cuando se aplican a los servicios que usa este servicio, incluidas las restricciones que requieren el uso de claves de encriptación administradas por el cliente (CMEK).
Se produce un error de solicitud incorrecta cuando se envía una imagen.
Cuando la API de Cloud Storage está en la lista de políticas Deny
de la
restricción constraints/gcp.restrictNonCmekServices
, no puedes enviar imágenes
a Container Registry si los buckets de almacenamiento subyacentes no están encriptados
con CMEK. Se muestra el siguiente mensaje:
unknown: Bad Request
Cuando se configura constraints/gcp.restrictCmekCryptoKeyProjects
, los buckets de almacenamiento se deben encriptar con una CryptoKey de una organización, carpeta o proyecto permitidos. Los buckets existentes que no cumplan con los requisitos deben configurarse para usar la clave requerida de forma predeterminada.
Para encriptar tus buckets de almacenamiento, consulta las instrucciones de Cloud Storage. El nombre del bucket de un host de registro tiene uno de los siguientes formatos:
artifacts.PROJECT-ID.appspot.com
para las imágenes almacenadas en el hostgcr.io
STORAGE-REGION.artifacts.PROJECT-ID.appspot.com
para imágenes almacenadas enasia.gcr.io
,eu.gcr.io
ous.gcr.io
.
No se creó automáticamente el tema de Pub/Sub de gcr
Cuando activas la API de Container Registry en un proyecto de Google Cloud, Container Registry intenta crear automáticamente un tema de Pub/Sub con el ID de tema gcr
usando claves de encriptación administradas por Google.
Cuando la API de Pub/Sub está en la lista de políticas Deny
de la restricción constraints/gcp.restrictNonCmekServices
, los temas deben encriptarse con CMEK. Las solicitudes para crear un tema sin encriptación de CMEK fallarán.
Para crear el tema gcr
con encriptación de CMEK, consulta las instrucciones de Pub/Sub para encriptar temas.
Límites de cuota
Si alcanzaste el límite de cuota de Container Registry, es posible que veas un mensaje de error como este:
Error: Status 429 trying to pull repository [...] "Quota Exceeded."
Para evitar alcanzar el límite de cuota, puedes hacer lo siguiente:
- Aumenta la cantidad de direcciones IP que se comunican con Container Registry. Las cuotas son por dirección IP.
- Agrega reintentos que introduzcan una demora. Por ejemplo, puedes usar la retirada exponencial.
El extremo del registro no es válido con boot2docker
Si tienes problemas para acceder a Container Registry desde un entorno boot2docker:
docker push gcr.io/example/sample
Error response from daemon: invalid registry endpoint https://gcr.io/v0/:
unable to ping registry endpoint https://gcr.io/v0/
v2 ping attempt failed with error: Get https://gcr.io/v2/:
x509: certificate has expired or is not yet valid
v1 ping attempt failed with error: Get https://gcr.io/v1/_ping:
x509: certificate has expired or is not yet valid.
If this private registry supports only HTTP or HTTPS with an unknown CA
certificate, please add `--insecure-registry gcr.io` to the daemon's
arguments. In the case of HTTPS, if you have access to the registry's CA
certificate, no need for the flag; simply place the CA certificate at
/etc/docker/certs.d/gcr.io/ca.crt
Es posible que necesites reiniciar boot2docker:
boot2docker stop
boot2docker start
Error al enviar una imagen a nivel raíz
Cuando intentas enviar una imagen de contenedor, el envío falla con un mensaje que incluye lo siguiente:
Pushing to root-level images is disabled
Este mensaje indica que etiquetaste la imagen con el nombre de host y la imagen, pero no incluiste el ID del proyecto.
Etiqueta la imagen con el formato correcto de la ruta de acceso a la imagen:
HOSTNAME/PROJECT-ID/IMAGE:TAG
Por ejemplo: gcr.io/web-project/web-app:1.0
.
Docker en Mac
Si tienes problemas con Docker en Mac, es posible que debas probar una solución alternativa. Los errores pueden incluir operaciones de envío y extracción de Docker que no responden o un error de red similar al siguiente:
Post https://us.gcr.io/v2/[repo name]/blobs/uploads/: dial tcp xx.xxx.xx.xx:xxx: i/o timeout
Si experimentas estos errores, prueba estos pasos:
Ejecuta el comando
docker-machine restart default
en la terminal de Mac para reiniciar el daemon de Docker.Asegúrate de que la opción "Almacenar de manera segura los accesos de Docker en el llavero de macOS" no esté habilitada en el menú Preferencias de Docker.
Asegúrate de estar ejecutando la versión más reciente de Docker.