En esta sección se explica cómo solucionar problemas habituales de Container Registry y Docker.
Proyectos con ámbito de dominio
Si recibes el error invalid reference format
, puede que tengas un proyecto con ámbito de dominio.
Si tu proyecto está acotado a tu dominio, el ID del proyecto incluye el dominio y dos puntos. Por ejemplo: example.com:my-project
. Consulta la sección sobre proyectos con ámbito de dominio para saber cómo trabajar con IDs de proyecto que incluyan un dominio.
Error: estado 405: v1 Registry API is disabled.
Si te encuentras continuamente con un error como "v1 Registry API is disabled" (La API de registro v1 está inhabilitada) al extraer o insertar imágenes, asegúrate de que el nombre de host, el ID de proyecto, el nombre de la imagen y la etiqueta o el digest estén escritos correctamente.
Para ver las etiquetas y el digest 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 las etiquetas y los resúmenes de imágenes de fichas, consulta Gestionar imágenes.
Problemas con los permisos
En las siguientes secciones se describen soluciones para problemas de permisos específicos. Asegúrate siempre de que tienes los permisos necesarios para enviar o extraer contenido. Consulta Permisos y roles.
Problemas de permisos relacionados con el acceso uniforme a nivel de segmento
Si has habilitado el acceso uniforme a nivel de segmento en un segmento de almacenamiento que usa Container Registry, es posible que tengas problemas para insertar y extraer contenido de Container Registry.
Para solucionar los problemas de acceso, asegúrate de que tienes los permisos necesarios para enviar o extraer. Estos permisos se indican en la sección Permisos y roles.
Problemas de permisos relacionados con la configuración de Docker en tu equipo local
Si aparece un error permission denied
, como el siguiente:
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
Puede que tengas que añadirte al grupo de usuarios docker
.
Ejecuta este comando en el shell o en la ventana del terminal:
sudo usermod -a -G docker ${USER}
Reinicia el sistema después de añadirte al grupo de usuarios docker
.
Problemas de permisos al comunicarse con Container Registry
Si aparece un error de permisos como el siguiente:
Permission denied: Unable to create the repository, please check that you have access to do so
Comprueba que la facturación esté habilitada en tu proyecto.
Verifica tu acceso:
Asegúrate de que tienes autenticación para
gcloud
ejecutando el siguiente comando:gcloud init
Comprueba que Docker esté configurado para usar
gcloud
como asistente de credenciales de Container Registry ejecutando el siguiente comando:gcloud auth configure-docker
Verifica que se puede ejecutar
docker-credential-gcloud
:docker-credential-gcloud list
Debería ver un objeto JSON con el 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 que tienes permiso de escritura en Cloud Storage en el proyecto al que estás enviando los datos. Si no es así, pide a un administrador que le dé acceso al usuario y vuelve a intentarlo.
Si el problema persiste después de que tengas el permiso correcto, puede que tu token de acceso se haya obtenido sin uno de estos ámbitos:
https://www.googleapis.com/auth/devstorage.read_write
https://www.googleapis.com/auth/devstorage.full_control
Para verificarlo, primero debes obtener el token de acceso. Esto 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 las instrucciones que se indican aquí para obtenerlo.
Una vez que hayas obtenido el token de acceso, puedes usar este comando para consultar los ámbitos que se han usado para obtenerlo:
curl -H "Authorization: Bearer <your access token>" https://www.googleapis.com/oauth2/v1/tokeninfo
Si los ámbitos mencionados no están incluidos, soluciona el problema para asegurarte de incluirlos al obtener 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, tendrás que corregir el ajuste de ámbito de esa máquina virtual y volver a crearla.
Problemas de permisos al insertar y extraer imágenes
La instancia de VM que envía o extrae imágenes debe configurarse correctamente con los permisos de gestión de identidades y accesos y los ámbitos de acceso necesarios para acceder al segmento de almacenamiento de Container Registry. Para obtener información sobre los ajustes necesarios, consulta Usar Container Registry con Google Cloud.
Error ImagePullBackoff de Google Kubernetes Engine
GKE devuelve un error ImagePullBackoff
cuando no puede extraer una imagen de un registro. El error puede producirse porque no se encuentra la imagen o porque tus nodos no tienen permisos para extraerla del registro. De forma predeterminada, los nodos de GKE tienen permisos para extraer imágenes de Container Registry cuando el registro está en el mismoGoogle Cloud proyecto que los nodos.
La documentación de GKE incluye los pasos que debe seguir para identificar la causa principal y resolver el problema.
Aplicación obligatoria de la política de organización
Las restricciones de las políticas de la organización pueden afectar al uso de Container Registry cuando se aplican a los servicios que utiliza Container Registry, incluidas las restricciones que requieren el uso de claves de cifrado gestionadas por el cliente (CMEK).
Error de solicitud incorrecta al enviar una imagen
Si la API de Cloud Storage está en la lista de políticas de Deny
de la restricción constraints/gcp.restrictNonCmekServices
, no podrás enviar imágenes a Container Registry si los segmentos de almacenamiento subyacentes no están cifrados con CMEK. Se devuelve el siguiente mensaje:
unknown: Bad Request
Cuando se configura constraints/gcp.restrictCmekCryptoKeyProjects
, los contenedores de almacenamiento deben cifrarse con una CryptoKey de un proyecto, una carpeta o una organización permitidos. Los contenedores que no cumplan los requisitos deben configurarse para que usen la clave obligatoria de forma predeterminada.
Para cifrar tus segmentos de almacenamiento, consulta las instrucciones de Cloud Storage. El nombre del segmento 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 las imágenes almacenadas enasia.gcr.io
,eu.gcr.io
ous.gcr.io
.
El tema de Pub/Sub de gcr no se ha creado automáticamente
Cuando activas la API Container Registry en unGoogle Cloud proyecto, Container Registry intenta crear automáticamente un tema de Pub/Sub con el ID de tema gcr
mediante claves de cifrado gestionadas por Google.
Cuando la API Pub/Sub se encuentra en la lista de políticas Deny
de la restricción constraints/gcp.restrictNonCmekServices
, los temas deben cifrarse con CMEK. No se podrán crear temas sin encriptado CMEK.
Para crear el tema gcr
con el cifrado CMEK, consulta las instrucciones para cifrar temas de Pub/Sub.
Límites de cuota
Si superas el límite de cuota de Container Registry, es posible que veas mensajes de error como este:
Error: Status 429 trying to pull repository [...] "Quota Exceeded."
Para no superar el límite de cuota fijo, puedes hacer lo siguiente:
- Aumenta el número de direcciones IP que se comunican con Container Registry. Las cuotas son por dirección IP.
- Añade reintentos que introduzcan un retraso. Por ejemplo, puedes usar la retirada exponencial.
Endpoint de registro no válido con boot2docker
Si tienes problemas para acceder a Container Registry desde un entorno de boot2docker, haz lo siguiente:
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 tengas que reiniciar boot2docker:
boot2docker stop
boot2docker start
Error al enviar una imagen de nivel raíz
Cuando intentas enviar una imagen de contenedor, el envío falla y aparece un mensaje que incluye lo siguiente:
Pushing to root-level images is disabled
Este mensaje indica que ha etiquetado la imagen con el nombre de host y la imagen, pero no ha incluido el ID de proyecto.
Etiqueta la imagen con el formato de ruta de imagen correcto:
HOSTNAME/PROJECT-ID/IMAGE:TAG
Por ejemplo: gcr.io/web-project/web-app:1.0
.
Docker en Mac
Si tienes algún problema con Docker en Mac, es posible que tengas que probar una solución alternativa. Entre los errores, se pueden incluir operaciones de envío o 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 se producen estos errores, prueba a seguir estos pasos:
Ejecuta el comando
docker-machine restart default
en el terminal de Mac para reiniciar el daemon de Docker.Comprueba que la opción "Securely store docker logins in macOS keychain" (Almacenar de forma segura los inicios de sesión de Docker en el llavero de macOS) no esté habilitada en el menú Preferencias de Docker.
Asegúrate de que estás usando la versión más reciente de Docker.