Come posso recuperare un'immagine Docker da un repository privato e utilizzarla in una piattaforma Docker Elastic Beanstalk?

4 minuti di lettura
0

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:

  1. Genera un token di autenticazione valido
  2. Crea un bucket Amazon Simple Storage Service (Amazon S3) e archivia il file di autenticazione
  3. 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.

  1. Installa Docker sul tuo computer eseguendo il seguente comando:

    $ brew install docker
  2. Crea un account su dockerhub.

  3. Crea un repository e trasferisci un'immagine nel repository.

  4. Esegui il comando Docker login:

    $ Docker login
  5. Crea un file denominato credentials.env utilizzando il seguente comando:

    $ vi credentials.env
  6. 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/
  7. 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
  8. 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

Utilizzo di immagini da un repository privato

Accesso a immagini Docker private da AWS Elastic Beanstalk

AWS UFFICIALE
AWS UFFICIALEAggiornata 10 mesi fa