Comment récupérer une image Docker depuis un référentiel privé et l'utiliser sur une plateforme Docker Elastic Beanstalk ?

Lecture de 4 minute(s)
0

Je souhaite extraire une image Docker d'un référentiel privé et l'utiliser sur ma plateforme Elastic Beanstalk.

Brève description

Lorsque vous extrayez une image depuis un référentiel privé, l'erreur suivante peut s'afficher depuis votre instance Elastic Beanstalk :

Message d'erreur provenant de /var/log/ecs/ecs-agent.log[CannotPullContainerError] Réponse d'erreur de démon : accès au pull refusé pour {username}/{repo}, le référentiel n'existe pas ou peut nécessiter une « connexion docker » : refusé : l'accès demandé à la ressource est refusé » module=docker_client.go

Cette erreur se produit lorsqu'il existe un écart d'authentification entre le registre privé et Elastic Beanstalk. Pour utiliser une image provenant d'un référentiel privé, Elastic Beanstalk doit s'authentifier auprès du registre en ligne qui héberge le référentiel privé. Il doit s'authentifier avant de récupérer et de déployer vos images à partir d'un référentiel privé. Il existe deux options pour récupérer et stocker les informations d'identification d'un environnement Elastic Beanstalk afin de s'authentifier auprès d'un référentiel privé :

  • Magasin de paramètres AWS Systems Manager (SSM)
  • Fichier DockerRun.aws.json

Résolution

Pour récupérer une image Docker depuis un référentiel privé à l'aide d'un fichier DockerRun.aws.json, procédez comme suit :

  1. Générer un jeton d'authentification valide
  2. Créez un compartiment Amazon Simple Storage Service (Amazon S3) et stockez le fichier d'authentification
  3. Créez le fichier DockerRun.aws.json v2

Générer un jeton d'authentification valide

Remarque : Si vous recevez des erreurs lors de l’exécution des commandes de l’interface de la ligne de commande AWS (AWS CLI), vérifiez que vous exécutez une version récente d’AWS CLI.

  1. Installez Docker sur votre machine en exécutant la commande suivante :

    $ brew install docker
  2. Créez un compte sur Dockerhub.

  3. Créez un référentiel et transférez une image vers celui-ci.

  4. Exécutez la commande de connexion Docker:

    $ Docker login
  5. Créez un fichier nommé credentials.env à l'aide de la commande suivante :

    $ vi credentials.env
  6. Ajoutez les informations d'identification suivantes au fichier créé précédemment :

    Remarque : Assurez-vous de remplacer tous les exemples de chaînes par les valeurs que vous avez spécifiées, puis enregistrez votre fichier et quittez le mode éditeur.

    DOCKER_USERNAME=example-user-name
    DOCKER_PASSWORD=example-password
    DOCKER_REGISTRY=https://index.docker.io/v1/
  7. Exécutez la commande suivante :

    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. Récupérez le fichier .dockercfg :

    $ cat  /opt/data/dockercfg

    Exemple de sortie :

    {
    "https://index.docker.io/v1/ ": {
    "auth": '**************************AMTE="     
    },
    "HttpHeaders": {
    "User-Agent": "Docker-Client/18.03.1-ce (linux)"
    }
    }

    **Remarque :**Assurez-vous d'inclure le. dockercfgfichier dans le bundle source de votre application.

Créez un compartiment Amazon S3 et stockez le fichier d'authentification

Créez un compartiment Amazon S3 sécurisé et transférez le fichier dockercfgdans le compartiment. Assurez-vous de ce qui suit :

  • Le compartiment Amazon S3 est hébergé dans la même région AWS que l'environnement qui l'utilise. Elastic Beanstalk ne peut pas télécharger de fichiers depuis un compartiment Amazon S3 hébergé dans d'autres régions.
  • Des autorisations sont accordées pour l'opération S****3:GetObjectau rôle AWS Identity and Access Management (IAM) dans le profil d'instance.

Créez le fichier DockerRun.aws.json v2

Créez le fichier DockerRun.aws.json v2 en exécutant la commande suivante et en ajoutant les informations du compartiment Amazon S3 sous le paramètre d'authentification :

  • Pour le paramètre du compartiment, ajoutez les informations relatives à votre compartiment Amazon S3.
  • Pour le paramètre image, ajoutez le nom de votre image avec la balise. Cela peut être récupéré depuis votre compte 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        
}      
]    
}  
]
}

Remarque : La commande précédente permet à votre instance Elastic Beanstalk de s'authentifier avec succès auprès du registre en ligne.

Renseignement connexes

Utilisation d'images provenant d'un référentiel privé

Accès à des images Docker privées depuis AWS Elastic Beanstalk

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an