从命令行运行时,要从特定注册表中提取,我可以运行以下命令:
dockerCommand=$("aws ecr get-login --profile profileName --region us-west-2")
$dockerCommand (which looks like docker login -u AWS -p ..longPassword.. -e none https://ACCTID.dkr.ecr.us-west-2.amazonaws.com
docker pull ACCTID.dkr.ecr.us-west-2.amazonaws.com/REPO/NAME:TAGNAME
如果我想要不同的注册表,我会更改区域或配置文件名称
尝试使用 docker-py,我有
import boto3
import docker
dockerClient = docker.from_env()
session = boto3.setup_default_session(profile_name='vzw')
client = session.client('ecr', region_name='us-west-2')
token = client.get_authorization_token(registryIds=[registryId])
username = 'AWS'
password = token['authorizationData'][0]['authorizationToken']
registry = token['authorizationData'][0]['proxyEndpoint']
regClient = dockerClient.login(username, password, registry)
但dockerClient
拒绝与以下对象建立连接:
用户名或密码错误
从那里,一旦工作完成,我将想要使用 docker 客户端 pull/push 在注册表之间移动图像。
这是正确的方向吗?还是我应该尝试完全用 shell 脚本来实现这一点?(Python 对于 boto 调用描述每个注册表中的内容特别有价值)
答案1
登录失败
dockerClient 因“用户名或密码错误”拒绝连接
您调用来登录的函数的签名是:
def login(self, username, password=None, email=None, registry=None,
reauth=False, insecure_registry=False, dockercfg_path=None):
注意参数的位置registry
。它在列表中排在第四位。因此,您的调用:
regClient = dockerClient.login(username, password, registry)
传递的是registry
第三个参数。建议你改成类似这样:email
email
regClient = dockerClient.login(username, password, registry=registry)
Python 还是 shell?
这是正确的方向吗?还是我应该尝试完全用 shell 脚本来实现这一点?(Python 对于 boto 调用描述每个注册表中的内容特别有价值)
使用 Python。
答案2
完整的有效代码示例:
#!/usr/bin/env python3
import base64, docker, boto3
docker_client = docker.from_env(version='1.24')
ecr_client = boto3.client('ecr', region_name='eu-west-1')
token = ecr_client.get_authorization_token()
username, password = base64.b64decode(token['authorizationData'][0]['authorizationToken']).decode().split(':')
registry = token['authorizationData'][0]['proxyEndpoint']
docker_client.login(username, password, registry=registry)
当然,您应该首先设置您的 AWS 凭证,例如:
export AWS_ACCESS_KEY_ID=youraccesskey
export AWS_SECRET_ACCESS_KEY=yoursecretaccesskey
答案3
auth_config
我发现将图像推送到 ECR 时传递用户名/密码是最简单的。
import boto3
import base64
import docker
sess = boto3.Session()
resp = sess.client('ecr').get_authorization_token()
token = resp['authorizationData'][0]['authorizationToken']
token = base64.b64decode(token).decode()
username, password = token.split(':')
auth_config = {'username': username, 'password': password}
# get local docker client
client = docker.from_env()
# build/tag image here....
# then override the docker client config by passing auth_config
client.image.push(<image name>, auth_config=auth_config)
希望这对某人有帮助!
答案4
有一个未决问题在项目中,他们的一个解决方法对我有用 -在执行 Docker 登录时从注册表中docker-py
删除前导:https://
registry_url = token['authorizationData'][0]['proxyEndpoint'].replace("https://", "")