Я написал скрипт Python для извлечения изображений из AWS ECR в экземпляр Ubuntu.В этом случае я запускаю команды docker с sudo
, поскольку Docker не настроен как пользователь без полномочий root.
Я использую sudo
при вызове сценария.Я обнаружил, что если я в данный момент вошел в AWS ECR, а затем запустил скрипт, он работает, как и ожидалось.Тем не менее, если я не вошел в систему, и токен аутентификации истек, кажется, что docker login
работает, но когда я пытаюсь и тяну, я получаю сообщение, указывающее, что «хранилище не существует, или мне требуется« вход в Docker »».
Изучая журналы, он проверяет это с помощью
15 февраля 06:00:38 ubuntu-xenial dockerd [1388]: time = "2019-02-15T06: 00: 38.832827449Z "level = error msg =" Не продолжается pull после ошибки: отказано: срок действия вашего токена авторизации истек. Запустите 'aws ecr get-login --no-include-email', чтобы получить новый. "
def log_into_aws_ecr(docker_client, region):
# To do, set region
ecr_client = boto3.client('ecr', region_name=region)
# Get all repos
response = ecr_client.describe_repositories()
repo_names = []
repositories = response.get('repositories', [])
for repo in repositories:
name = repo.get('repositoryName', '')
if len(name):
repo_names.append(name)
token = ecr_client.get_authorization_token()
username, password = base64.b64decode(token['authorizationData'][0]['authorizationToken']).decode('utf-8').split(":")
registry_url = token['authorizationData'][0]['proxyEndpoint']
login_results = docker_client.login(username, password, email='', registry=registry_url)
prefix='https://'
if registry_url.startswith(prefix):
registry = registry_url[len(prefix):]
else:
registry = registry_url
auth_config_payload = {'username': username, 'password': password }
return ecr_client, repo_names, registry
Обратите внимание, что этот код также подвергается рефакторингу, поэтому есть некоторые переменные, которые определены, но в настоящее время не используются.
Предоставленный docker_client
получен черезline
docker_client = docker.from_env()
Я пытался запустить как
sudo -E ./myscript.py image
Но это тоже не работает.У меня есть вариант с использованием сценария bash, и он отлично работает.
Вывод для docker_client.login
выглядит как
Поиск записи авторизации для 'ABCXYZ.dkr.ecr.us-west-2.amazonaws.com 'Найдено' ABCXYZ.dkr.ecr.us-west-2.amazonaws.com '
И если я дам ответ, он будет выглядеть следующим образом.
{'password': 'ПАРОЛЬ ЗДЕСЬ', 'email': нет, 'username': 'AWS', 'serveraddress': 'ABCXYZ.dkr.ecr.us-west-2.amazonaws.com '}