Come posso risolvere l'errore "CannotPullContainerError: hai raggiunto il limite di pull rate" in Amazon ECS?

Ultimo aggiornamento: 25/03/2022

Quando provo a estrarre immagini da Docker Hub, la mia attività Amazon Elastic Container Service (Amazon ECS) non riesce con il seguente errore:

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 - Messaggio server: numero di richieste eccessivo: hai raggiunto il limite di pull rate. Puoi aumentare il limite eseguendo l'autenticazione e l'aggiornamento all'indirizzo https://www.docker.com/increase-rate-limit

Breve descrizione

Questo errore viene visualizzato quando si prova ad estrarre un'immagine dal repository pubblico di Docker Hub dopo aver raggiunto il limite di pull rate di Docker e viene restituito un codice di stato http 429. Docker Hub utilizza gli indirizzi IP per autenticare gli utenti e i limiti di pull rate si basano su singoli indirizzi IP. Per gli utenti anonimi, il limite di frequenza è impostato su 100 pull ogni 6 ore per indirizzo IP. Per gli utenti autenticati con un ID Docker, la pull rate è impostata su 200 pull per un periodo di 6 ore. Se la tua richiesta pull di immagini supera questi limiti, le richieste vengono rifiutate fino allo scadere della finestra di sei ore. Se esegui il carico di lavoro Amazon ECS/Amazon EKS, la maggior parte dei dati viene recuperata attraverso un gateway NAT che ha un indirizzo IP fisso. In questo caso, la richiesta viene limitata quando si supera il limite di pull.

Risoluzione

Utilizzare una delle seguenti soluzioni alternative per risolvere questo problema.

Copia le immagini pubbliche in un registro privato di Amazon ECR

Crea un repository Amazon Elastic Container Registry (Amazon ECR), quindi inserisci l'immagine in questo nuovo repository. Con questo approccio, potresti evitare di superare il limite di pull di Docker Hub estraendo le immagini dal repository Amazon ECR.

1.    Emetti un comando simile al seguente per estrarre l'immagine da Docker Hub:

docker pull example-image

2.    Emetti un comando simile al seguente per autenticare il tuo client Docker per accedere al registro 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.    Emetti un comando simile al seguente per etichettare l'immagine da inviare al tuo repository:

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

4.    Emetti un comando simile al seguente per inviare l'immagine Docker in un registro Amazon ECR:

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

5.    Emetti un comando simile al seguente per aggiornare il file Docker in modo da utilizzare l'immagine Amazon ECR appena inviata come immagine di base:

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

Assicurati di sostituire i seguenti valori nei comandi precedenti:

  • example-image con il nome dell'immagine pubblica che desideri inserire
  • 1111222233334444 con il tuo ID account
  • myrepository:latest con il nome del registro Amazon ECR
  • eu-west-1 con la Regione di tua scelta

Autenticazione del pull di Docker Hub

Se esegui l'autenticazione con Docker Hub, hai più limiti di velocità come utente autenticato e la velocità è limitata in base al nome utente Docker. Puoi memorizzare il nome utente e la password di Docker Hub come segreto in AWS Secrets Manager, quindi utilizzare questo segreto per autenticarti su Docker Hub.

Creazione di un segreto di Secrets Manager per le credenziali di Docker Hub

Per creare un segreto per le credenziali Docker Hub, utilizza le istruzioni riportate nella sezione Creazione di un segreto di base in Abilitazione dell'autenticazione del registro privato.

Aggiornamento del ruolo AWS Identity and Access Management (AWS IAM) per l'esecuzione di attività

Per concedere l'accesso per l'attività Amazon ECS al segreto creato, devi aggiungere manualmente le autorizzazioni richieste come policy in linea al ruolo di esecuzione dell'attività.

1.    Apri la console IAM.

2.    Nel pannello di navigazione, scegli Ruoli.

3.    Cerca l'elenco di ruoli per ecsTaskExecutionRole e scegli il ruolo per visualizzare le policy allegate.

4.    Nella scheda Autorizzazioni, scegli Aggiungi autorizzazioni, quindi scegli Crea policy in linea.

5.    Nella pagina Crea policy, scegli JSON, quindi copia e incolla le seguenti policy:

{
 "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"
  ]
 }]
}

Assicurati di sostituire quanto segue nella policy:

  • 1111222233334444 con il tuo ID account
  • eu-west-1 con la regione di tua scelta
  • mykey con la tua chiave AWS KMS

Nota: includi kms:Decrypt solo se la chiave non utilizza la chiave di default ma utilizza una chiave AWS Key Management Service (AWS KMS) personalizzata. Aggiungi l'ARN per la tua chiave personalizzata come risorsa.

6.    Scegli Review policy (Esamina policy).

7.    In Name (Nome), immetti il nome della policy (ECSSecrets).

8.    Scegli Create policy (Crea policy).

Creazione di una definizione di attività che utilizzi il segreto per l'autenticazione Docker

Segui le istruzioni riportate in Creazione di una definizione di attività utilizzando la console classica per creare la definizione delle attività di Amazon ECS. Per il ruolo di esecuzione dell'attività, assicurati di selezionare il ruolo IAM di esecuzione dell'attività aggiornato nella sezione precedente.

Nella sezione Definizioni container, procedi come segue:

  1. Scegli Aggiungi container.
  2. Per Nome container, inserisci il nome del container.
  3. Per Immagine, inserisci il nome dell'immagine o includi il percorso della tua immagine privata (ad esempio repository-url/image.tag).
  4. Seleziona Autenticazione del repository privato.
  5. Per ARN o nome di Secrets Manager, inserisci l'ARN del segreto che hai creato.
  6. Scegli Aggiungi.

Creazione di un cluster Amazon ECS ed esecuzione dell'attività Amazon ECS

Crea un cluster Amazon ECS. Quindi, esegui l'attività utilizzando la definizione di attività creata nella sezione precedente.

Utilizza il registro pubblico di Amazon ECR per le immagini di container pubblici

Identifica le immagini pubbliche che stai utilizzando nel file Docker. Cerca queste immagini nella galleria pubblica di Amazon ECR utilizzando i filtri di ricerca appropriati. Non è necessario autenticarsi per esplorare i repository pubblici ed estrarre immagini. Il registro pubblico di Amazon ECR contiene immagini di base popolari, tra cui sistemi operativi, immagini pubblicate da AWS, componenti aggiuntivi Kubernetes e artefatti. Puoi evitare di raggiungere il limite di frequenza di Docker Hub estraendo immagini dal registro pubblico di Amazon ECR.

È possibile utilizzare queste immagini come origine per l'immagine container nella definizione di attività:

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

Puoi anche scegliere di usare queste immagini come immagine di base nel tuo file Docker:

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

Effettua l'upgrade a un abbonamento Docker Pro o Team

Puoi aggiornare il tuo piano a un abbonamento Docker Pro o Team che offre 50.000 pull in un periodo di 24 ore. Per ulteriori informazioni sui piani tariffari, consulta i prezzi di Docker Hub.


Questo articolo è stato utile?


Hai bisogno di supporto tecnico o per la fatturazione?