Come posso recuperare un'immagine Docker da un repository privato e utilizzarla in una piattaforma Docker Elastic Beanstalk?
Desidero estrarre un'immagine Docker da un repository privato e utilizzarla nella mia piattaforma Elastic Beanstalk.
Breve descrizione
Quando estrai un'immagine da un repository privato, potresti ricevere il seguente messaggio di errore dalla tua istanza di Elastic Beanstalk:
Messaggio di errore da /var/log/ecs/ecs-agent.log[CannotPullContainerError] Error response from daemon: pull access denied for {username}/{repo}, repository does not exist or may require 'docker login': denied: requested access to the resource is denied" module=docker_client.go
Questo errore si verifica quando è presente un gap di autenticazione tra il registro privato ed Elastic Beanstalk. Per utilizzare un'immagine da un repository privato, Elastic Beanstalk deve autenticarsi con il registro online che ospita il repository privato. Deve autenticarsi prima di recuperare e distribuire le immagini da un repository privato. Esistono due possibilità per recuperare e archiviare le credenziali per l'autenticazione in un repository privato di un ambiente Elastic Beanstalk:
- Archivio di parametri di AWS Systems Manager (SSM)
- File Dockerrun.aws.json
Risoluzione
Per recuperare un'immagine Docker da un repository privato utilizzando un file Dockerrun.aws.json, completa i seguenti passaggi:
- Genera un token di autenticazione valido
- Crea un bucket Amazon Simple Storage Service (Amazon S3) e archivia il file di autenticazione
- Creare il file Dockerrun.aws.json v2
Genera un token di autenticazione valido
Nota: se ricevi degli errori durante l'esecuzione dei comandi dell’interfaccia della linea di comando AWS (AWS CLI), assicurati di utilizzare una versione recente di AWS CLI.
-
Installa Docker sul tuo computer eseguendo il seguente comando:
$ brew install docker
-
Crea un account su dockerhub.
-
Crea un repository e trasferisci un'immagine nel repository.
-
Esegui il comando Docker login:
$ Docker login
-
Crea un file denominato credentials.env utilizzando il seguente comando:
$ vi credentials.env
-
Aggiungi le seguenti credenziali al file precedente creato:
Nota: assicurati di sostituire tutte le stringhe di esempio con i valori specificati, quindi salva il file ed esci dalla modalità editor.
DOCKER_USERNAME=example-user-name DOCKER_PASSWORD=example-password DOCKER_REGISTRY=https://index.docker.io/v1/
-
Esegui il seguente comando:
docker run -it --rm \ -env-file=credentials.env \ v "$(pwd):/opt/data/" \ v "/var/run/docker.sock:/var/run/docker.sock" \ codeship/dockercfg-generator /opt/data/dockercfg
-
Recupera il file .dockercfg:
$ cat /opt/data/dockercfg
Esempio di output:
{ "https://index.docker.io/v1/ ": { "auth": '**************************AMTE=" }, "HttpHeaders": { "User-Agent": "Docker-Client/18.03.1-ce (linux)" } }
Nota: assicurati di includere il file .dockercfg nel tuo bundle sorgente dell'applicazione.
Crea un bucket Amazon S3 e archivia il file di autenticazione
Crea un bucket Amazon S3 sicuro e trasferisci il file .dockercfg nel bucket. Accertati di quanto segue:
- Il bucket Amazon S3 è ospitato nella stessa regione AWS dell'ambiente che lo utilizza. Elastic Beanstalk non può scaricare file da un bucket Amazon S3 ospitato in altre regioni.
- Le autorizzazioni per l'operazione s****3:GetObject sono concesse al ruolo AWS Identity and Access Management (IAM) nel profilo dell'istanza.
Creare il file Dockerrun.aws.json v2
Crea il file Dockerrun.aws.json v2 eseguendo il seguente comando e aggiungi le informazioni sul bucket Amazon S3 nel parametro di autenticazione:
- Nel parametro bucket, aggiungi le informazioni sul bucket Amazon S3.
- Nel parametro immagine, aggiungi il nome dell'immagine con il tag. Questo può essere recuperato dal tuo account dockerhub.
{ "AWSEBDockerrunVersion": 2, "authentication": { "bucket": "example-bucket-name", "key": ".dockercfg" }, "volumes": [ { "name": "php-app", "host": { "sourcePath": "/var/app/current/php-app" } }, { "name": "nginx-proxy-conf", "host": { "sourcePath": "/var/app/current/proxy/conf.d" } } ], "containerDefinitions": [ { "name": "php-app", "image": "example-image-name", "essential": true, "memory": 128, "mountPoints": [ { "sourceVolume": "php-app", "containerPath": "/var/www/html", "readOnly": true }, { "sourceVolume": "awseb-logs-php-app", "containerPath": "/var/log/sample-app" } ] }, { "name": "nginx-proxy", "image": "nginx", "essential": true, "memory": 128, "portMappings": [ { "hostPort": 80, "containerPort": 80 } ], "links": [ "php-app" ], "mountPoints": [ { "sourceVolume":"php-app", "containerPath": "/var/www/html", "readOnly": true }, { "sourceVolume": "awseb-logs-nginx-proxy", "containerPath": "/var/log/nginx" }, { "sourceVolume": "nginx-proxy-conf", "containerPath": "/etc/nginx/conf.d", "readOnly": true } ] } ] }
Nota: il comando precedente consente all'istanza di Elastic Beanstalk di autenticarsi correttamente con il registro online.
Informazioni correlate
Contenuto pertinente
- AWS UFFICIALEAggiornata un anno fa
- AWS UFFICIALEAggiornata un anno fa
- AWS UFFICIALEAggiornata 3 anni fa
- AWS UFFICIALEAggiornata 3 mesi fa