我编写了一个Python脚本,将图像从AWS ECR拉到Ubuntu实例。在此实例上,我使用sudo
运行docker命令,因为未将Docker设置为非root用户。
我在调用脚本时确实使用sudo
。我发现的是,如果我当前先登录到AWS ECR,然后运行脚本,该脚本将按预期工作。但是,如果我没有登录,并且auth令牌已过期,看来docker login
可以正常工作,但是当我尝试拉时,我收到一条消息,指示“存储库不存在或我需要'docker login '”。
检查日志,它使用
进行验证2月15日06:00:38 Ubuntu-xenial dockerd [1388]: time =“ 2019-02-15T06:00:38.832827449Z” level = error msg =“不继续 错误后出现拉动:拒绝:您的授权令牌已过期。 请运行“ aws ecr get-login --no-include-email”以获取一个新的密码。”
def log_into_aws_ecr(docker_client, region):
# To do, set region
ecr_client = boto3.client('ecr', region_name=region)
# Get all repos
response = ecr_client.describe_repositories()
repo_names = []
repositories = response.get('repositories', [])
for repo in repositories:
name = repo.get('repositoryName', '')
if len(name):
repo_names.append(name)
token = ecr_client.get_authorization_token()
username, password = base64.b64decode(token['authorizationData'][0]['authorizationToken']).decode('utf-8').split(":")
registry_url = token['authorizationData'][0]['proxyEndpoint']
login_results = docker_client.login(username, password, email='', registry=registry_url)
prefix='https://'
if registry_url.startswith(prefix):
registry = registry_url[len(prefix):]
else:
registry = registry_url
auth_config_payload = {'username': username, 'password': password }
return ecr_client, repo_names, registry
请注意,此代码现在也正在重构,因此有一些已定义但当前未使用的变量。
通过行获取提供的docker_client
docker_client = docker.from_env()
我尝试以
的身份运行 sudo -E ./myscript.py image
但这也不起作用。我有一个使用bash脚本的变体,效果很好。
docker_client.login
的输出看起来像
正在查找“ ABCXYZ.dkr.ecr.us-west-2.amazonaws.com”的身份验证条目 找到了'ABCXYZ.dkr.ecr.us-west-2.amazonaws.com'
如果我转储响应,它看起来像这样。
{'password':'PASSWORD HERE','email':无,'username':'AWS', 'serveraddress':'ABCXYZ.dkr.ecr.us-west-2.amazonaws.com'}
答案 0 :(得分:0)
get_authorization_token
返回用户名和密码,但使用基本编码。参见https://github.com/aws/aws-cli/blob/develop/awscli/customizations/ecr.py#L53:L54
答案 1 :(得分:0)
好的,我不确定这是否完全正确,但是根据最近几天的一些实验,它确实可以工作。我也确实在docker-py GitHub存储库上发布了一个问题,但至少到目前为止,还没有人介入。
https://github.com/docker/docker-py/issues/2256
简而言之,我在链接中列出了以下内容:
好的,最近几天我进行了一些实验。不得不处理12小时的AWS ECR票,所以花了更长的时间。
似乎docker-py存在问题。
根据我的发现,我可以使用
boto3
或运行一个子流程 调用命令行到aws ecr
。但是唯一的排列 似乎可以按照以下步骤进行操作。
- 使用子过程执行
docker login
。这将导致config.json
文件被更新(不确定该文件是否包含 相关性)- 通过
docker_client = docker.from_env()
创建Docker客户端。我发现在子流程结果之前执行此操作不会 工作正常(除非您已经拥有有效的config.json
- 然后致电
docker_client.login(username=username, password=password, registry=registry_url)
这是否可以预期,或者我是否正在做某事 错,我不知道。这是我想出的步骤 工作。