如何从私有存储库检索 Docker 映像并在 Elastic Beanstalk Docker 平台中使用它?

2 分钟阅读
0

我想从私有存储库提取 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 映像,请完成以下步骤:

  1. 生成有效的身份验证令牌
  2. 创建 Amazon Simple Storage Service(Amazon S3)桶并存储身份验证文件
  3. 创建 Dockerrun.aws.json v2 文件

生成有效的身份验证令牌

**注意:**如果在运行 AWS 命令行界面(AWS CLI)命令时收到错误,请确认您运行的是最新版本的 AWS CLI。

  1. 运行以下命令,在您的计算机上安装 Docker:

    $ brew install docker
  2. dockerhub 上创建账户。

  3. 创建存储库并将映像传输到存储库。

  4. 运行 Docker login 命令:

    $ Docker login
  5. 使用以下命令创建名为 credentials.env 的文件:

    $ vi credentials.env
  6. 将以下凭证添加到先前创建的文件中:

    **注意:**确保将所有 example 字符串替换为您指定的值,然后保存文件并退出编辑器模式。

    DOCKER_USERNAME=example-user-name
    DOCKER_PASSWORD=example-password
    DOCKER_REGISTRY=https://index.docker.io/v1/
  7. 运行下列命令:

    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. 检索 .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 映像

AWS 官方
AWS 官方已更新 2 年前