1

我有一个脚本,它检索 ECR 的登录,使用登录凭据(reauth 设置为 True)对 DockerClient 实例进行身份验证,然后尝试提取指定的容器映像。

当在我的本地机器上运行与 EC2 实例上的 docker 守护进程交互时,该代码似乎运行良好,但是当从 EC2 实例运行时,我不断得到

404 Client Error: Not Found ("repository XXXXXXXX.dkr.ecr.eu-west-2.amazonaws.com/autohld-runner not found: does not exist or no pull access")

相同的存储库用于在 EC2 实例上本地和远程执行代码。我尝试在 ECR 中设置对图像的访问权限,以允许所有人和我的 AWS ID 都可以拉取。我还授予分配给 EC2 实例完全管理员访问权限的角色。都没有喜悦。

如果我通过命令行使用完全相同的 repo URI(从错误中复制)在 EC2 实例上执行相同的任务,则它可以正常工作。

我在 docker-py 中缺少什么吗?

url = "tcp://127.0.0.1:2375"
dockerd = docker.DockerClient(base_url=url, version='auto')
dockerd.login(username=ecr.username, password=ecr.password, email='none', registry=ecr.registry, reauth=True)
dockerd.images.pull(ecr.get_repo(instance.tags['Container']), tag='latest')

get_repo返回错误消息中报告的完整 URI,Container 元素的名称为“autohld-runner”

谢谢

4

1 回答 1

1

似乎如果已通过 cli 访问注册表,则设置了身份验证令牌或其他内容,并且 docker 会记住这一点,从而允许后续调用工作。但是,在这种情况下,实例会全新启动并使用 docker-py 中的登录方法。

这似乎没有将凭据传递给拉取,我发现使用auth_config命名参数并传入身份验证参数字典是可行的。

auth_creds = {'username': ecr.username, 'password': ecr.password}
dockerd.images.pull(ecr.get_repo(instance.tags['Container']), tag='latest', auth_config=auth_creds)

高温高压

于 2018-06-28T10:44:26.007 回答