如何使用 python docker-py 连接到 AWS ECR

efr*_*dom 9 python docker amazon-ecr

从命令行运行时,要从特定注册表中提取,我可以运行以下命令:

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
Run Code Online (Sandbox Code Playgroud)

如果我想要一个不同的注册表,我会更改区域或配置文件名称

用 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)
Run Code Online (Sandbox Code Playgroud)

dockerClient拒绝与以下内容的联系:

错误的用户名或密码

从那里开始,一旦工作正常,我将想要使用 docker 客户端拉/推在注册表之间移动图像。

是正确的方向还是我应该尝试完全使用 shell 脚本来实现?(Python 对于描述每个注册表中的内容的 boto 调用特别有价值)

小智 17

完整的代码示例:

#!/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)
Run Code Online (Sandbox Code Playgroud)

当然,您应该先设置您的 AWS 凭证,例如:

export AWS_ACCESS_KEY_ID=youraccesskey
export AWS_SECRET_ACCESS_KEY=yoursecretaccesskey
Run Code Online (Sandbox Code Playgroud)


小智 8

我遇到了同样的问题,你必须:

  1. 从base64解码

  2. 从字节转换为字符串

  3. 将登录名“AWS”分开

     password = (base64.b64decode(response['authorizationData'][0]['authorizationToken'])).decode("utf-8").split(':')[-1]
    
    Run Code Online (Sandbox Code Playgroud)


小智 8

我发现将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)

Run Code Online (Sandbox Code Playgroud)

希望这对某人有帮助!


小智 7

登录失败

dockerClient 拒绝连接“错误的用户名或密码”

您调用登录的函数的签名是:

def login(self, username, password=None, email=None, registry=None,
          reauth=False, insecure_registry=False, dockercfg_path=None):
Run Code Online (Sandbox Code Playgroud)

注意参数的位置registry。它在列表中排名第四。所以你的电话是:

regClient = dockerClient.login(username, password, registry)
Run Code Online (Sandbox Code Playgroud)

传递你的因为registry是第三个参数。建议你改成这样:emailemail

regClient = dockerClient.login(username, password, registry=registry)
Run Code Online (Sandbox Code Playgroud)

Python 还是 shell?

这是正确的方向还是我应该尝试完全使用 shell 脚本来实现这一点?(Python 对于 boto 调用来描述每个注册表中的内容特别有价值)

使用Python。