如何从私有存储库检索 Docker 映像并在 Elastic Beanstalk Docker 平台中使用它?
我想从私有存储库提取 Docker 映像,然后在我的 Elastic Beanstalk 平台上使用它。
简短描述
当您从私有存储库提取映像时,您的 Elastic Beanstalk 实例可能会出现以下错误:
来自 /var/log/ecs/ecs-agent.log 的错误消息[CannotPullContainerError] 来自进程守护程序的错误响应:{username}/{repo} 的拉取访问被拒绝,存储库不存在或者可能需要“docker login”:被拒绝:请求访问资源被拒绝”module=docker_client.go
当私有注册表和 Elastic Beanstalk 之间存在身份验证间隙时,就会出现此错误。要使用私有存储库中的映像,Elastic Beanstalk 必须通过托管私有存储库的在线注册表进行身份验证。它必须先进行身份验证,然后才能从私有存储库检索和部署您的映像。有两种方法可以检索和存储 Elastic Beanstalk 环境的凭证,以便对私有存储库进行身份验证:
- AWS Systems Manager (SSM) Parameter Store
- Dockerrun.aws.json 文件
解决方法
要使用 Dockerrun.aws.json 文件从私有存储库中检索 Docker 映像,请完成以下步骤:
- 生成有效的身份验证令牌
- 创建 Amazon Simple Storage Service(Amazon S3)桶并存储身份验证文件
- 创建 Dockerrun.aws.json v2 文件
生成有效的身份验证令牌
**注意:**如果在运行 AWS 命令行界面(AWS CLI)命令时收到错误,请确认您运行的是最新版本的 AWS CLI。
-
运行以下命令,在您的计算机上安装 Docker:
$ brew install docker
-
在 dockerhub 上创建账户。
-
创建存储库并将映像传输到存储库。
-
运行 Docker login 命令:
$ Docker login
-
使用以下命令创建名为 credentials.env 的文件:
$ vi credentials.env
-
将以下凭证添加到先前创建的文件中:
**注意:**确保将所有 example 字符串替换为您指定的值,然后保存文件并退出编辑器模式。
DOCKER_USERNAME=example-user-name DOCKER_PASSWORD=example-password DOCKER_REGISTRY=https://index.docker.io/v1/
-
运行下列命令:
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
-
检索 .dockercfg 文件:
$ cat /opt/data/dockercfg
输出示例:
{ "https://index.docker.io/v1/ ": { "auth": '**************************AMTE=" }, "HttpHeaders": { "User-Agent": "Docker-Client/18.03.1-ce (linux)" } }
**注意:**确保包含您的应用程序源包中的 .dockercfg 文件。
创建 Amazon S3 桶并存储身份验证文件
创建安全的 Amazon S3 桶并将 .dockercfg 文件传输到桶。请确保以下各项:
- Amazon S3 桶托管在与使用它的环境相同的 AWS 区域中。Elastic Beanstalk 无法从托管在其他地区的 Amazon S3 桶下载文件。
- 向实例配置文件中的 AWS Identity and Access Management(IAM)角色授予执行 s****3:GetObject 操作的权限。
创建 Dockerrun.aws.json v2 文件
运行以下命令来创建 Dockerrun.aws.json v2 文件,然后在 authentication 参数下添加 Amazon S3 桶信息:
- 对于 bucket 参数,添加您的 Amazon S3 桶信息。
- 对于 image 参数,添加带有标签的映像名称。这可以从您的 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 } ] } ] }
**注意:**上述命令允许您的 Elastic Beanstalk 实例成功地通过在线注册表进行身份验证。
相关信息
相关内容
- AWS 官方已更新 8 个月前
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 个月前