Mob*_*Ben 3 python amazon-web-services docker
我编写了一个 Python 脚本来将映像从 AWS ECR 提取到 Ubuntu 实例。在此实例中,我运行 docker 命令,因为sudoDocker 未设置为非 root 用户。
sudo我在调用脚本时确实使用。我发现如果我当前先登录 AWS ECR 然后运行脚本,它会按预期工作。但是,如果我没有登录,并且身份验证令牌已过期,则似乎docker login可以工作,但是当我尝试拉取时,我收到一条消息,指示“存储库不存在或我需要'docker登录'”。
检查日志,它验证这一点
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
Run Code Online (Sandbox Code Playgroud)
请注意,此代码现在也正在重构,因此有一些变量已定义但当前未使用。
提供的内容docker_client是通过线路获得的
docker_client = docker.from_env()
Run Code Online (Sandbox Code Playgroud)
我尝试过运行
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”
如果我转储响应,它看起来像这样。
{'密码':'此处密码','电子邮件':无,'用户名':'AWS','服务器地址':'ABCXYZ.dkr.ecr.us-west-2.amazonaws.com'}
好吧,我不太确定这是否完全正确,但是,根据过去几天的一些实验,它确实有效。我也在 docker-py GitHub 存储库上提出了一个问题,但至少到目前为止,还没有人插话。
https://github.com/docker/docker-py/issues/2256
简而言之,我在链接中列出了以下内容:
好吧,我这几天做了一些实验。必须处理 12 小时的 AWS ECR 票证,所以花了更长的时间。
看来 docker-py 确实有问题。
根据我的发现,我可以使用
boto3或运行调用命令行的子进程aws ecr。然而,唯一的排列似乎适用于以下步骤。
- 使用子进程来执行
docker login. 这将导致config.json文件被更新(不确定这是否有任何相关性)。- 通过创建 docker 客户端
docker_client = docker.from_env()。我发现在子流程之前执行此操作会导致它无法正常工作(除非您已经有一个有效的config.json- 然后打电话
docker_client.login(username=username, password=password, registry=registry_url)我不知道这是否是预期的,或者我是否做错了什么。这就是我想出的有效步骤。
| 归档时间: |
|
| 查看次数: |
3256 次 |
| 最近记录: |