我想从私有存储库提取 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 Elastic Beanstalk 访问私有 Docker 映像