web-dev-qa-db-ja.com

python docker-pyを使用してAWS 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

別のレジストリが必要な場合は、リージョンまたはプロファイル名を変更します

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クライアントのプル/プッシュを使用して、レジストリ間で画像を移動します。

正しい方向ですか、これを完全にシェルスクリプトで実装する必要がありますか? (Pythonは、各レジストリの内容を説明するboto呼び出しにとって特に価値があります)

7
efreedom

ログイン失敗

dockerClientは「不正なユーザー名またはパスワード」での接続を拒否します

ログインのために呼び出す関数のシグネチャは次のとおりです。

def login(self, username, password=None, email=None, registry=None,
          reauth=False, insecure_registry=False, dockercfg_path=None):

registryパラメータの位置に注意してください。リストの4番目です。だからあなたの呼び出し:

regClient = dockerClient.login(username, password, registry)

registryは3番目のパラメーターなので、emailemailとして渡します。次のようなものに変更することをお勧めします:

regClient = dockerClient.login(username, password, registry=registry)

Pythonまたはシェル?

正しい方向ですか、これを完全にシェルスクリプトで実装する必要がありますか? (Pythonは、各レジストリの内容を説明するboto呼び出しにとって特に価値があります)

Pythonを使いましょう。

4
Stephen Rauch

機能する完全なコード例:

#!/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_ACCCESS_KEY=yoursecretaccesskey
10
Otto

私は同じ問題に直面しました、あなたはしなければなりません:

  1. base64からデコード
  2. バイトから文字列に変換する
  3. ログイン「AWS」を分離する

    password = (base64.b64decode(response['authorizationData'[0]authorizationToken'])).decode("utf-8").split(":")[-1]
    
7

画像をECRにプッシュするときにauth_configをユーザー名/パスワードとともに渡すのが最も簡単であることがわかりました。

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)

これが誰かを助けることを願っています!

1
Martin