Я использую Docker в Windows (Docker для Windows, а не Docker Toolbox) и aws cli в оболочке cygwin ("git bash"). Я пытаюсь вставить образ докера в AWS ECR - частный репозиторий ECS.
Что бы я ни делал - когда я бегаю docker push
, я постоянно получаю:
no basic auth credentials
Способ 1
Я следую инструкциям и запускаю стандартные команды:
$ $(aws --profile myprofile ecr get-login --region us-east-1)
Login Succeeded
$ docker tag myrepo:latest 123456789.dkr.ecr.us-east-1.amazonaws.com/myrepo:latest
$ docker push 123456789.dkr.ecr.us-east-1.amazonaws.com/myrepo:latest
The push refers to a repository [232097583865.dkr.ecr.us-east-1.amazonaws.com/potion]
688f61a6956d: Preparing
11908ead416e: Preparing
no basic auth credentials
Безуспешно.
Попытка вытянуть показывает, что у меня действительно нет доступа:
$ docker pull 123456789.dkr.ecr.us-east-1.amazonaws.com/myrepo
Using default tag: latest
Pulling repository 123456789.dkr.ecr.us-east-1.amazonaws.com/myrepo
unauthorized: authentication required
Однако докер действительно думает, что я вошел в систему:
$ docker logout https://123456789.dkr.ecr.us-east-1.amazonaws.com
Remove login credentials for https://123456789.dkr.ecr.us-east-1.amazonaws.com
# let's run again - should not be logged in now
$ docker logout https://123456789.dkr.ecr.us-east-1.amazonaws.com
Not logged in to https://123456789.dkr.ecr.us-east-1.amazonaws.com
Хм.
Способ 2
Интернет предлагает проанализировать команду и использовать старую процедуру для входа в систему.
В основном сводится к следующему:
docker login -u AWS -p $(aws --profile myprofile ecr get-authorization-token --region us-east-1 --output text --query authorizationData[].authorizationToken | python -c 'import base64, sys; print base64.b64decode(sys.stdin.read())' | cut -d: -f2) https://123456789.dkr.ecr.us-east-1.amazonaws.com
Это тоже кажется успешным, но docker push
или pull
приводят к тому же провалу.
Другие мертвые концы
Windows и cygwin - это странно. Итак, давайте поместим команду docker login
в файл сценария оболочки и запустим ее или создадим ее. Безуспешно.
Создание дополнительных профилей AMI с явными токенами доступа и новыми наборами учетных данных. Безуспешно.
Экспорт учетных данных AWS в качестве переменных среды и повторение процесса. Безуспешно.
Использование замечательного скрипта aws-temp-token.sh который принимает код MFA и генерирует учетные данные сеанса как переменные среды. Безуспешно (хотя в других случаях инструмент спасает жизнь, поэтому используйте его).
Осторожно, спойлеры
В конце концов мне удалось решить эту проблему. Это было так неприятно, и я не нашел упоминания о решении в Интернете, так что написание ответа, надеюсь, облегчит часть душевной боли.