¿Cómo puedo resolver el error “CannotPullContainerError: You have reached your pull rate limit” (CannotPullContainerError: ha alcanzado su límite de tasa de extracción) en Amazon ECS?

Última actualización: 25-03-2022

Cuando intento extraer imágenes de Docker Hub, mi tarea de Amazon Elastic Container Service (Amazon ECS) presenta el siguiente error:

CannotPullContainerError: inspect image has been retried 5 time(s): httpReaderSeeker: failed open: unexpected status code https://registry-1.docker.io/v2/manifests/sha256:2bb501e6429 Too Many Requests - Server message: toomanyrequests: You have reached your pull rate limit. (CannotPullContainerError: la inspección de la imagen se ha vuelto a probar 5 veces: httpReaderSeeker: error abierto: código de error inesperado https://registry-1.docker.io/v2/manifests/sha256:2bb501e6429 Demasiadas solicitudes - Mensaje del servidor: toomanyrequests: alcanzó el límite de la tasa de extracción). You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit (Puede aumentar el límite mediante la autenticación y la actualización: https://www.docker.com/increase-rate-limit)

Descripción corta

Se recibe este error cuando se intenta extraer una imagen del repositorio de Docker Hub público después de haber alcanzado el límite de la tasa de extracción de Docker y se devuelve un código de estado HTTP 429. Docker Hub utiliza direcciones IP para autenticar a los usuarios, y los límites de las tasas de extracción se basan en direcciones IP individuales. Para los usuarios anónimos, el límite de la tasa se establece en 100 extracciones cada 6 horas por dirección IP. Para los usuarios autenticados con un ID de Docker, la tasa de extracción se establece en 200 extracciones cada 6 horas. Si su solicitud de extracción de imágenes supera estos límites, estas solicitudes se rechazarán hasta que transcurran las seis horas. Si ejecuta su carga de trabajo de Amazon ECS o Amazon EKS, la mayoría de los datos se extraen a través de una puerta de enlace NAT que tiene una dirección IP fija. En este caso, se limita la solicitud cuando supera el límite de extracción.

Resolución

Utilice una de las siguientes soluciones para resolver este problema.

Copiar imágenes públicas en un registro privado de Amazon ECR

Cree un repositorio de Amazon Elastic Container Registry (Amazon ECR) y, luego, inserte la imagen en este repositorio nuevo. Con este enfoque, puede evitar superar el límite de extracción de Docker Hub mediante la extracción de las imágenes del repositorio de Amazon ECR.

1.    Ejecute un comando similar al siguiente para extraer la imagen de Docker Hub:

docker pull example-image

2.    Ejecute un comando similar al siguiente para autenticar su cliente de Docker para acceder al registro de Amazon ECR:

aws ecr get-login-password --region eu-west-1 | docker login --username AWS --password-stdin 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com

3.    Ejecute un comando similar al siguiente para etiquetar la imagen e insertarla en su repositorio:

docker tag myrepository:latest 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com/myrepository:latest

4.    Ejecute un comando similar al siguiente para insertar la imagen de Docker en un registro de Amazon ECR:

docker push 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com/myrepository:latest

5.    Ejecute un comando similar al siguiente para actualizar el archivo Docker y utilizar la imagen de Amazon ECR recién insertada como la imagen base:

FROM 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com/myrepository:tag

Asegúrese de reemplazar los siguientes elementos en los comandos anteriores:

  • example-image por el nombre de la imagen pública que desea insertar
  • 1111222233334444 por el ID de su cuenta
  • myrepository:latest por el nombre de su registro de Amazon ECR
  • eu-west-1 por la región de su elección

Autenticar la extracción de Docker Hub

Si realiza la autenticación con Docker Hub, tiene más límites de tasa como usuario autenticado y tiene una tasa limitada en función del nombre de usuario de Docker. Puede almacenar el nombre de usuario y la contraseña de Docker Hub como un secreto en AWS Secrets Manager y, luego, utilizar este secreto para autenticarse en Docker Hub.

Crear un secreto de Secrets Manager para las credenciales de Docker Hub

Si desea crear un secreto para sus credenciales de Docker Hub, siga las instrucciones de la sección Para crear un secreto básico en Habilitación de la autenticación de registros privados.

Actualizar el rol de ejecución de tareas de AWS Identity and Access Management (AWS IAM)

Si desea conceder acceso al secreto que creó para la tarea de Amazon ECS, debe agregar de forma manual los permisos necesarios como una política insertada al rol de ejecución de tareas.

1.    Abra la consola de IAM.

2.    En el panel de navegación, elija Roles (Roles).

3.    Busque en la lista de roles ecsTaskExecutionRole y elija el rol para ver las políticas adjuntas.

4.    En la pestaña Permissions (Permisos), elija Add permissions (Agregar permisos) y, luego, elija Create inline policy (Crear política insertada).

5.    En la página Create policy (Crear política), elija JSON y, luego, copie y pegue la siguiente política:

{
 "Version": "2012-10-17",
 "Statement": [{
  "Effect": "Allow",
  "Action": [
   "secretsmanager:GetSecretValue",
   "kms:Decrypt"
  ],
  "Resource": [
   "arn:aws:secretsmanager:eu-west-1:1111222233334444:secret:dockerhub-0knT",
   "arn:aws:kms:eu-west-1:1111222233334444:key/mykey"
  ]
 }]
}

Asegúrese de reemplazar los siguientes elementos en la política:

  • 1111222233334444 por el ID de su cuenta
  • eu-west-1 por la región de su elección
  • mykey por la clave de AWS KMS

Nota: Incluya kms:Decrypt solo si su clave no utiliza la clave predeterminada y emplea una clave personalizada de AWS Key Management Service (AWS KMS). Agregue el ARN de su clave personalizada como recurso.

6.    Elija Review Policy (Revisar política).

7.    En Name (Nombre), ingrese el nombre de la política (ECSSecrets).

8.    Elija Create policy (Crear política).

Crear una definición de tarea que utilice el secreto para la autenticación de Docker

Siga las instrucciones de Creating a task definition using the classic console (Creación de una definición de tarea con la consola clásica) para crear su definición de tarea de Amazon ECS. En Task execution role (Rol de ejecución de tareas), asegúrese de seleccionar el rol de IAM de ejecución de tareas que actualizó en la sección anterior.

En la sección Container definitions (Definiciones de contenedores), haga lo siguiente:

  1. Elija Add container (Agregar contenedor).
  2. En Container name (Nombre del contenedor), ingrese el nombre de su contenedor.
  3. En Image (Imagen), ingrese el nombre de la imagen o incluya la ruta a su imagen privada (por ejemplo, repository-url/image.tag).
  4. Seleccione Private repository authentication (Autenticación de repositorio privado).
  5. En Secrets Manager ARN or name (ARN o nombre de Secrets Manager), ingrese el ARN del secreto que creó.
  6. Elija Add (Agregar).

Crear un clúster de Amazon ECS y ejecutar la tarea de Amazon ECS

Cree un clúster de Amazon ECS. Luego, ejecute la tarea mediante la definición de tarea que creó en la sección anterior.

Utilice el registro público de Amazon ECR para las imágenes de contenedores públicos

Identifique las imágenes públicas que utiliza en el archivo Docker. Busque estas imágenes en la galería pública de Amazon ECR con los filtros de búsqueda adecuados. No necesita completar autenticación para explorar los repositorios públicos y extraer imágenes. El registro público de Amazon ECR contiene imágenes base populares, incluidos sistemas operativos, imágenes publicadas por AWS, complementos de Kubernetes y artefactos. Puede evitar alcanzar el límite de la tasa de Docker Hub mediante la extracción de imágenes del registro público de Amazon ECR.

Puede utilizar estas imágenes como el origen de la imagen del contenedor en la definición de tarea:

ContainerDefinitions: [
 {
 ...
 Image: 'public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest'
 ...
 }
 ]

También puede optar por utilizar estas imágenes como imagen base en su archivo Docker:

Docker File
FROM public.ecr.aws/amazonlinux/amazonlinux:latest

Mejorar el plan con una suscripción de Docker Pro o Team

Puede mejorar su plan con una suscripción de Docker Pro o Team que ofrece 50 000 extracciones cada 24 horas. Para obtener más información acerca de los planes de precios, consulte los precios de Docker Hub.


Precios de Amazon ECR

Amazon ECR Public service quotas (Cuotas de servicio de Amazon ECR Public)

¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?