Solución de problemas

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.

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.

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
  1. Verifica que la facturación esté habilitada para tu proyecto.

  2. Verifica tu acceso:

    1. Ejecuta el siguiente comando a fin de asegurarte de que estás autenticado para gcloud:

      gcloud init
      
    2. 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
      
    3. 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"
      }
      
    4. 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.

    5. 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. Para obtener información sobre la configuración requerida, consulta Usa 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 las políticas de la organización

Las restricciones de las políticas de la organización pueden afectar Container Registry cuando se aplican a los servicios que Container Registry usos, 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 del 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 mostrará 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 las políticas deben para usar la clave requerida de forma predeterminada.

Para encriptar tus buckets de almacenamiento, consulta el 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 host gcr.io
  • STORAGE-REGION.artifacts.PROJECT-ID.appspot.com para las imágenes almacenadas en asia.gcr.io, eu.gcr.io o us.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 para la restricción constraints/gcp.restrictNonCmekServices, los temas deben encriptarse con CMEK. Las solicitudes para crear un tema sin encriptación con CMEK fallarán.

Para crear el tema gcr con encriptación CMEK, consulta Pub/Sub instrucciones 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 cuando se envía una imagen de 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 la etiqueta de la ruta de acceso de 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.