我有一个脚本,用于检索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实例完全管理权限的角色。所有人都没有喜悦。
如果我通过命令行在EC2实例上执行具有完全相同的仓库URI(从错误中复制)的相同任务,则它毫无问题。
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'
谢谢
答案 0 :(得分:1)
似乎,如果已通过cli访问了注册表,则设置了auth令牌或其他内容,而docker记住这一点,从而可以进行后续调用。但是,在这种情况下,实例将完全重新启动,并使用docker-py中的login方法。
这似乎并没有将凭据传递给请求,我发现使用auth_config
命名参数并传递auth参数字典是可行的。
auth_creds = {'username': ecr.username, 'password': ecr.password}
dockerd.images.pull(ecr.get_repo(instance.tags['Container']), tag='latest', auth_config=auth_creds)
HTH