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 :
- Générer un jeton d'authentification valide
- Créez un compartiment Amazon Simple Storage Service (Amazon S3) et stockez le fichier d'authentification
- 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.
-
Installez Docker sur votre machine en exécutant la commande suivante :
$ brew install docker
-
Créez un compte sur Dockerhub.
-
Créez un référentiel et transférez une image vers celui-ci.
-
Exécutez la commande de connexion Docker:
$ Docker login
-
Créez un fichier nommé credentials.env à l'aide de la commande suivante :
$ vi credentials.env
-
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/
-
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
-
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