Docker push to AWS ECR не работает в Windows: никаких базовых учетных данных
Я использую docker на окнах (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 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
в файл оболочки script и запустите ее или отправьте ее. Нет успеха.
Создание дополнительных профилей AMI с явными токенами доступа и новыми наборами учетных данных. Нет успеха.
Экспорт учетных данных AWS в качестве переменных среды и повторение процесса. Нет успеха.
Использование awesome aws-temp-token.sh script, который принимает код MFA и генерирует учетные данные сеанса как переменные среды. Нет успеха (хотя инструмент - спасатель в другое время, поэтому используйте его).
Предупреждение о спойлере
В конце концов мне удалось решить эту проблему. Это было так расстраивать, хотя и я не нашел ни одного упоминания об этом решении в Интернете, поэтому написание ответа, должно быть, облегчит некоторые психические боли.
Ответы
Ответ 1
Один из моих поисков привел меня к этому ответу, который, хотя и не имеет отношения к моему делу, привлек к моему вниманию место хранения учетных данных: докер config.json
файл. Посмотрите здесь, чтобы узнать больше об этом и его использовании.
Однако мой собственный файл имел это содержимое после входа в систему с помощью любого из вышеперечисленных методов:
{
"auths": {
"https://123456789.dkr.ecr.us-east-1.amazonaws.com": {}
},
"credsStore": "wincred"
}
Явное упоминание Windows (wincred
) привлекло мое внимание. Более подробно об этом, кажется, что докеры в Windows используют вспомогательный хранилище учетных данных, что, вероятно, лучше, чем хранение учетных данных в виде обычного текста в файловой системе ( он обычно хранится как base64, который является греческим для "обычного текста" ).
Однако - это решение появилось, когда я вручную отредактировал этот файл, чтобы содержать токен аутентификации напрямую.
Я сгенерировал свой токен аутентификации с помощью этой команды (сокращение сокращено для краткости):
$ aws --profile myprofile ecr get-authorization-token --region us-east-1 --output text --query authorizationData[].authorizationToken
jFHNnVxZ............Vqc==
После редактирования ~/.docker/config.json
он выглядел примерно так:
{
"auths": {
"https://123456789.dkr.ecr.us-east-1.amazonaws.com": {
"auth": "jFHNnVxZ............Vqc=="
}
}
}
И с этим на месте, нажатие, наконец, успешно:
$ docker push 123456789.dkr.ecr.us-east-1.amazonaws.com/myrepo:latest
The push refers to a repository [123456789.dkr.ecr.us-east-1.amazonaws.com/myrepo]
61a69688f56d: Pushed
11ad4908e16e: Pushed
myrepo: digest: sha256:20c0f3......82aa19 size: 42162
И все снова хорошо.
Ответ 2
Расширив свой блестящий ответ, который вывел меня из тюрьмы. Я обнаружил, что если вы удалите:
,
"credsStore": "wincred"
Сохраните файл, запустите команду входа в docker снова, он поместит учетные данные непосредственно в config.json, который я нашел для работы.
Оставляя что-то вроде
{
"auths": {
"https://407163548648.dkr.ecr.eu-west-1.amazonaws.com": {
"auth": "QV...Nbz0=",
"email": "AWS"
}
}
}
Ответ 3
Добавляя больше к вышесказанному, это, вероятно, заслуживает того, что проблема связана с совместимостью Docker для AWS и проблемой с документацией AWS. Docker делает все правильно в этом случае, используя хранилище учетных данных Windows, однако AWS пытается перегрузить базовый auth с помощью сертификата auth.
В частности, запуск docker login
на самом деле делает добавление записи в хранилище учетных данных Windows. Вы можете увидеть это, открыв Диспетчер учетных данных, выберите "Учетные данные Windows", и вы увидите новую запись для введенного URL https://12345678.dkr.ecs.region.amazonaws.com
.
Проблема заключается в том, что AWS использует открытый ключ в качестве пароля, и Windows не позволит вам вводить длинный пароль. Вы можете попробовать это, скопировав пароль из AWS, отредактировав сохраненный учетные данные и попытку вставить значение. Windows не позволит вам.
Ответ 4
Попробуйте следующее:
eval $(aws ecr get-login --no-include-email | sed 's|https://||')
Ответ 5
Шаг 1: Получите свой токен авторизации:
aws --profile default ecr get-authorization-token --region us-east-1 --output text --query authorizationData[].authorizationToken
(Примечание: если у вас есть профиль, измените по умолчанию имя вашего профиля)
Шаг 2: отредактируйте ваш ~/.docker/config.json
{
"auths": {
"https://45456644454545.dkr.ecr.us-east-1.amazonaws.com": {
"auth": "TRdfdhwe53hsdshhSdSHdsdssdsd...GGSDe="
}
}
}
Шаг 3: теперь вы можете нажать на изображение вашего докера.