Не удается отправить изображение в Amazon ECR - происходит сбой при отсутствии базовых учетных данных аутентификации
Я пытаюсь вставить образ докера в реестр Amazon ECR. Я использую Docker-клиент Docker версии 1.9.1, сборка a34a1d5. Я использую "aws ecr get-login --region us-east-1", чтобы получить кредиты для входа в докер. Затем я успешно войти в систему с этими кредитами следующим образом:
docker login -u AWS -p XXXX -e none https://####.dkr.ecr.us-east-1.amazonaws.com
WARNING: login credentials saved in /Users/ar/.docker/config.json
Login Succeeded
Но когда я пытаюсь нажать свое изображение, я получаю следующую ошибку:
$ docker push ####.dkr.ecr.us-east-1.amazonaws.com/image:latest
The push refers to a repository [####.dkr.ecr.us-east-1.amazonaws.com/image] (len: 1)
bcff5e7e3c7c: Preparing
Post https://####.dkr.ecr.us-east-1.amazonaws.com/v2/image/blobs/uploads/: no basic auth credentials
Я убедился, что у пользователя aws были правильные разрешения. Я также позаботился о том, чтобы репозиторий позволил этому пользователю перейти на него. Просто чтобы убедиться, что это не проблема, я настроил реестр, чтобы предоставить всем пользователям полный доступ. Ничто не изменяет ошибку "без базовых учетных данных". Я не знаю, как начать отлаживать это, так как весь трафик зашифрован.
ОБНОВИТЬ
Так что у меня был небольшой момент Гомера Симпсона, когда я понял основную причину моей проблемы. У меня есть доступ к нескольким аккаунтам AWS. Несмотря на то, что я использовал aws configure, чтобы установить свои учетные данные для учетной записи, в которой я настроил свой репозиторий, aws cli фактически использовал переменные среды AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY. Поэтому, когда я сделал aws ecr get-login, он возвращал логин не той учетной записи. Я не заметил, что номера счетов были другими, пока не вернулся, чтобы попробовать некоторые из предложенных ответов. Когда я удаляю переменные окружения, все работает правильно. Я предполагаю, что девиз этой истории: если вы нажмете эту ошибку, убедитесь, что репозиторий, в который вы входите, соответствует тегу, который вы применили к изображению.
49 ответов
Если вы бежите $(aws ecr get-login --region us-east-1)
все будет сделано за вас
Обновить
Начиная с версии 2 AWS CLI - aws ecr get-login
устарел, и правильный метод aws ecr get-login-password
.
Поэтому правильный и обновленный ответ следующий:docker login -u AWS -p $(aws ecr get-login-password --region us-east-1) xxxxxxxx.dkr.ecr.us-east-1.amazonaws.com
В моем случае это была ошибка в Docker для Windows и их поддержке диспетчера учетных данных Windows.
Открыть свой ~/.docker/config.json
и удалите "credsStore": "wincred"
запись.
Это приведет к записи учетных данных в config.json
непосредственно. Вы должны будете войти снова после этого.
Вы можете отследить эту ошибку через билеты #22910 и #24968 на GitHub.
Если вы используете профили, не забудьте пройти --profile=XXX
в aws ecr get-login
,
У меня тоже была эта проблема. Что случилось со мной, я забыл выполнить команду, которая была возвращена мне после того, как я побежал
aws ecr get-login --region ap-southeast-2
Эта команда вернула большой двоичный объект, который включает в себя docker login
команда прямо там! Я не поняла Он должен вернуть что-то вроде этого:
docker login -u AWS -p <your_token_which_is_massive> -e none <your_aws_url>
Скопируйте и вставьте эту команду, а затем запустите команду Docker push, которая выглядит примерно так:
docker push 8888888.blah.blah.ap-southwest-1.amazonaws.com/dockerfilename
Это должно было работать даже без открытия разрешений. Смотрите документацию: Аутентификация частного реестра.
[Правка: на самом деле, у меня тоже были проблемы с разрешениями при выполнении второго теста. Посмотрите, как Docker подталкивает к неудачному закрытому репо AWS ECR с искаженным JSON).]
Тем не менее у меня была та же проблема; Я не знаю почему, но я успешно использовал более сложный механизм аутентификации, описанный в документации для get-authorization-token
Версии AWS CLI и Docker:
$ aws --version
aws-cli/1.9.17 Python/2.7.6 Linux/3.16.0-38-generic botocore/1.3.17
$ docker --version
Docker version 1.9.1, build a34a1d5
Получить токен авторизации ("пароль докера").
aws ecr get-authorization-token --region us-east-1 --output text \
--query authorizationData[].authorizationToken | base64 -d | cut -d: -f2
Примечание. В моем ~/.aws/config указан другой регион по умолчанию, поэтому мне нужно было явно указать --region us-east-1
,
Войти в интерактивном режиме (изменить ############
на ваш аккаунт AWS):
docker login -u AWS https://############.dkr.ecr.us-east-1.amazonaws.com/
password: <paste the very long password from above>
email: <I left this blank>
Нажмите на изображение (при условии, что вы сделали изображение докера test
):
docker tag test:latest ############.dkr.ecr.us-east-1.amazonaws.com/test:latest
docker push ############.dkr.ecr.us-east-1.amazonaws.com/test:latest
The push refers to a repository [910732017890.dkr.ecr.us-east-1.amazonaws.com/test] (len: 1)
d5122f58a2e1: Pushed
7bddbca3b908: Pushed
latest: digest: sha256:bc0b521fd398bd1a2ef58a289dcb910334608723fd570e7bddb36eacd0060363 size: 4378
Попробуйте с:
eval $(aws ecr get-login --no-include-email | sed 's|https://||')
до толчка.
Если это кому-нибудь поможет...
Моя проблема заключалась в том, что я должен был использовать --profile
опция для аутентификации с правильным профилем из файла учетных данных.
Далее я пропустил --region [region_name]
команда, которая также выдавала ошибку "без основных аутентификационных данных".
Решением для меня было изменение моей команды из этого:
aws ecr get-login
К этому:
aws --profile [profile_name] ecr get-login --region [region_name]
Пример:
aws --profile foo ecr get-login --region us-east-1
Надеюсь, что это помогает кому-то!
Существует известная ошибка в диспетчере учетных данных wincred в Windows. Удаление https:// из сгенерированной команды входа решает эту проблему.
docker login -u AWS -p <password> <aws_account_id>.dkr.ecr.<region>.amazonaws.com
вместо
docker login -u AWS -p <password> https://<aws_account_id>.dkr.ecr.<region>.amazonaws.com
Смотрите также страницу устранения неполадок.
Я испытал ту же проблему.
Создание новых учетных данных AWS (ключей доступа) и перенастройка интерфейса командной строки AWS с новыми учетными данными позволили решить эту проблему.
Ранее, aws ecr get-login --region us-east-1
сгенерированная команда входа в Docker с неверным URL-адресом реестра EC.
Docker CLI не поддерживает собственные методы аутентификации IAM. Чтобы аутентифицировать и авторизовать запросы Docker push и pull, выполните этот шаг.
Шаг 1
Проверьте, правильно ли настроены учетные данные aws. Чтобы настроить учетные данные AWS, выполните следующую команду и укажите свои учетные данные AWS.
aws configure
шаг 2
вы можете аутентифицировать Docker в частном реестре Amazon ECR с помощью get-login-password (рекомендуется)
linux и msc
aws ecr get-login-password --region <your region> | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<your region>.amazonaws.com
для окон
(Get-ECRLoginCommand).Password | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.<your region>.amazonaws.com
или же
вы также можете использовать метод --get-login (но предоставить учетные данные) (не рекомендуется).
для linux и mac
$(aws ecr get-login --region <your region> --no-include-email)
для окон
Invoke-Expression -Command (Get-ECRLoginCommand -Region <your region>).Command
Если вы получили Успешный вход в систему, тогда все готово. иначе обратитесь к документам aws для ошибки
шаг 3
Отправьте свое изображение в репо
Отметьте свое изображение
тег докера <aws_account_id>.dkr.ecr..amazonaws.com / my-web-app
Отправьте свое изображение с помощью следующей команды.
docker push <aws_account_id>.dkr.ecr..amazonaws.com / my-web-app
Примечание: это логин на основе токена, и сгенерированный токен авторизации действителен только в течение 12 часов.
- Убедитесь, что вы сначала создали реестр ECR.
Затем, в соответствии с инструкциями команды ECR Push, вырежьте и вставьте следующие команды - Выполните команду входа в систему docker (eval в Mac/Linux пропускает вырезание и вставку)
eval $(aws ecr get-login --region us-east-1)
добавить --profile, если вы используете несколько учетных записей AWSeval $(aws ecr get-login --region us-east-1 --profile your-profile)
docker build -t image-name .
docker tag image-name:latest ############.dkr.ecr.us-east-1.amazonaws.com/image-name:latest
docker push ############.dkr.ecr.us-east-1.amazonaws.com/image-name:latest
В случае ошибки, убедитесь, что вы запустите все команды снова! Учетные данные, которые вы используете aws ecr get-login
являются временными и истекает.
В Windows в PowerShell используйте:
Invoke-Expression $(aws ecr get-login --no-include-email)
У меня была эта проблема по другой причине: мне нужно было нажать на реестр, не связанный с моей учетной записью AWS (реестр ECR клиента). Клиент предоставил мне доступ на вкладке "Разрешения" для реестра, добавив мой идентификатор IAM (например, arn:aws:iam::{AWS ACCT #}:user/{Username}
) в качестве принципала. Я попытался войти с обычными шагами:
$(aws ecr get-login --region us-west-2 --profile profilename)
docker push {Client AWS ACCT #}.dkr.ecr.us-west-1.amazonaws.com/imagename:latest
Что, конечно, привело к no basic auth credentials
, Оказывается, aws ecr get-login
регистрирует вас в ECR для реестра, связанного с вашим логином, что имеет смысл задним числом. Решение состоит в том, чтобы сказать aws ecr get-login
в какой реестр (ы) вы хотите войти.
$(aws ecr get-login --region us-west-2 --profile profilename --registry-ids {Client AWS ACCT #})
После этого, docker push
работает просто отлично.
Только что было обновление, в котором get-login был удален из AWS, вместо этого используйте get-login-password:
sudo docker login -u AWS -p $(aws ecr get-login-password --region <region> -
-profile <profile>) <account id>.dkr.ecr.eu-north-1.amazonaws.com
Не забудьте удалить флаг --profile при использовании учетных данных по умолчанию
В моем случае после запуска aws ecr get-login --no-include-email --region *****
Я просто скопировал вывод этой команды в форме docker login -u *** -p ************
, и вы вставляете его в подсказку. Толчок пошел вперед.
После запуска этой команды:
(aws ecr get-login --no-include-email --region us-west-2)
просто запустите команду docker login из вывода
docker login -u AWS -p epJ....
это способ входа Docker в ECR
Документы AWS говорят вам выполнить следующую команду (для региона ap-southeast-2)
aws ecr get-login --region ap-southeast-2
Когда я столкнулся с этой проблемой, мне было непонятно, основываясь на этих документах, что вам нужно ввести результат этой команды в терминал и выполнить его.
Исправление, которое работало для меня, было копировать результат в буфер обмена с
aws ecr get-login --region ap-southeast-2 | pbcopy
Вставьте результат в командную строку и выполните его
Эта ошибка обычно возникает, если вход в систему ecr не удался. Я использую систему Windows, и я использовал "Powershell" в режиме администратора, чтобы сначала войти в ecr.
Invoke-Expression $(aws ecr get-login --no-include-email)
Это должно вывести "Вход в систему выполнен успешно".
Команда docker, предоставляемая aws-cli, не очень удобна...
При использовании входа в Docker Docker сохранит пару сервер: ключ в вашей цепочке для ключей или в файле ~/.docker/config.json.
Если он сохраняет ключ в " https://7272727.dkr.ecr.us-east-1.amazonaws.com/", поиск ключа во время push не удастся, потому что docker будет искать сервер с именем "7272727.dkr.ecr.us-east-1.amazonaws.com", а не" https://7272727.dkr.ecr.us-east-1.amazonaws.com/".
Используйте следующую команду для входа в систему:
eval $ (aws ecr get-login --no-include-email --region us-east-1 --profile yourprofile | sed 's | https://%7C%7C')
Как только вы запустите команду, вы получите сообщение "Login Succeeded", и тогда вы в порядке.
после этого ваша команда push должна работать
Для Mac OSX
TL;DR Убедитесь, что ваш ключ "auths" точно соответствует ключу хранилища учетных данных
- Проверьте конфигурацию вашего докера:
cat ~/.docker/config.json
Пример результата:
{
"auths": {
"https://55511155511.dkr.ecr.us-east-1.amazonaws.com": {}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/19.03.5 (darwin)"
},
"credsStore": "osxkeychain"
}
Обратите внимание, что значение "auths" - это пустой объект, а докер использует хранилище учетных данных "osxkeychain".
- Откройте приложение Mac "Связка ключей" и найдите имя "Учетные данные Docker".
Обратите внимание на Where:
поле
- Убедитесь, что
auths
ключ в~/.docker/config.json
соответствуетWhere:
в Keychain Access.
Если auths
ключ в ~/.docker/config.json НЕ соответствует им Where:
в связке ключей, вы можете получить Login Succeeded
от docker login...
но все равно получить
ERROR: Service 'web' failed to build: Get https://55511155511.dkr.ecr.us-east-1.amazonaws.com/v2/path/to/image/latest: no basic auth credentials
когда пытаешься тянуть.
В моем случае мне нужно было добавить https://
Оригинал
"auths": {
"55511155511.dkr.ecr.us-east-1.amazonaws.com": {}
},
Исправлена
"auths": {
"https://55511155511.dkr.ecr.us-east-1.amazonaws.com": {}
},
У меня работает следующая команда:
sudo $(aws ecr get-login --region us-east-1 --no-include-email)
И тогда я запускаю эти команды:
sudo docker tag e9ae3c220b23(image_id) aws_account_id.dkr.ecr.region.amazonaws.com/my-web-app
sudo docker push aws_account_id.dkr.ecr.region.amazonaws.com/my-web-app
Я столкнулся с той же самой проблемой, и ошибка, которую я сделал, использовала неправильный путь репо
например: docker push xxxxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/jenkins:latest
В вышеупомянутом пути я совершил ошибку: "dkr.ecr.us-east-1.amazonaws.com"
вместо "west"
, Я использовалeast"
, Как только я исправил свою ошибку, я смог успешно нажать на изображение.
Просто добавив к этому, как в случае, если кто-то страдает от того, что никогда не читал Руководство F, как я,
я выполнил все предложенные выше шаги, такие как
aws ecr get-login-password --region eu-west-1 | docker login --username AWS --password-stdin 123456789.dkr.ecr.eu-west-1.amazonaws.com
И всегда не получал никаких базовых учетных данных для авторизации,
я создал реестр с именем
123456789.dkr.ecr.eu-west-1.amazonaws.com/my.registry.com/namespace
и пытался протолкнуть изображение под названием alpine: latest
123456789.dkr.ecr.eu-west-1.amazonaws.com/my.registry.com/namespace/alpine:latest
2c6e8b76de: Preparing
9d4cb0c1e9: Preparing
1ca55f6ab4: Preparing
b6fd41c05e: Waiting
ad44a79b33: Waiting
2ce3c1888d: Waiting
no basic auth credentials
Глупая ошибка с моей стороны, поскольку я должен создать реестр в ecr, используя полный путь к контейнеру.
Я создал новый реестр, используя полный путь к контейнеру, не заканчиваясь пространством имен
123456789.dkr.ecr.eu-west-1.amazonaws.com/my.registry.com/namespace/alpine
и низко и вот толкает к
123456789.dkr.ecr.eu-west-1.amazonaws.com/my.registry.com/namespace/alpine:latest
The push refers to repository [123456789.dkr.ecr.eu-west-1.amazonaws.com/my.registry.com/namespace/alpine]
0c8667b5b: Pushed
730460948: Pushed
1.0: digest: sha256:e1f814f3818efea45267ebfb4918088a26a18c size: 7
работает нормально
Есть очень простой способ отправить образы докеров в ECR: Amazon ECR Docker Credential Helper. Просто установите его в соответствии с предоставленным руководством, обновите свой~/.docker/config.json
в дальнейшем:
{
"credsStore": "ecr-login"
}
и вы сможете выталкивать / тянуть свои изображения без docker login
.
Я боролся с тем же самым. Пожалуйста, выполните следующие шаги -
- aws configure (настройте с вашими учетными данными)
- Если вы создали репозиторий ECR, в консоли вы можете найти кнопку «просмотреть команды push». Вы получите там три команды и сможете нажимать. Иначе, вот три команды ниже.
- aws ecr get-login-password --region | docker login --username AWS --password-stdin .dkr.ecr.us-west-2.amazonaws.com
- создайте свой образ докера - docker build -t.
- тег докера: последний .dkr.ecr.us-west-2.amazonaws.com /: последний
- docker push .dkr.ecr.us-west-2.amazonaws.com /: последний
Обратите внимание: в .dkr.ecr.us-west-2.amazonaws.com регион будет вашим регионом по умолчанию. Для меня это us-west-2 отсюда то же самое.
Надеюсь, это сэкономит ваше время.
Убедитесь, что пользователь, с которым вы запускаете Docker локально, является тем пользователем, которого вы используете для последующей отправки образа. Для меня работа с sudo вызвала проблему. Удаление sudo из команды решило эту проблему. Надеюсь, это поможет и сэкономит чье-то время, и никто больше не совершит эту глупую ошибку. Ниже приведен результат для справки.
sudo docker push {your-account-id}.dkr.ecr.us-east-1.amazonaws.com/{repository-name}:{tag-name}
The push refers to repository [{your-account-id}.dkr.ecr.us-east-1.amazonaws.com/{repository-name}]
f13afaa342eb: Preparing
d01b75ce3235: Preparing
7eaa58141607: Preparing
519e8c5b2557: Preparing
15d4a3a33fec: Preparing
fdbbf41b1ab8: Waiting
4b88ecda5399: Waiting
e23a8e1e773f: Waiting
6623e2cc11cd: Waiting
no basic auth credentials
Запуск без sudo работал отлично
docker push {your-account-id}.dkr.ecr.us-east-1.amazonaws.com/{repository-name}:{tag-name}
The push refers to repository [{your-account-id}.dkr.ecr.us-east-1.amazonaws.com/{repository-name}]
f13afaa342eb: Pushed
d01b75ce3235: Pushed
7eaa58141607: Pushed
519e8c5b2557: Pushed
15d4a3a33fec: Pushed
fdbbf41b1ab8: Pushed
4b88ecda5399: Pushed
e23a8e1e773f: Pushed
6623e2cc11cd: Pushed
{tag-name}: digest: sha256:5ceaa5bf7605559582960b6d56a8eece9486ce0950bca9dd63a0dcd38a520bf0 size: 4293
Я столкнулся с этой проблемой, а также работает на OSX. Я увидел ответ Оливера Зальцбурга и проверил мой ~/.docker/config.json. Внутри него было несколько учетных данных авторизации от разных учетных записей AWS, которые у меня есть. Я удалил файл и после запуска get-login он снова заработал.
FWIW, Debian 9, Docker версия 18.06.1-ce, сборка e68fc7a:
$(aws ecr get-login | sed 's| -e none | |g')
Если вы используете несколько профилей и вам нужно войти в профиль, который не является профилем по умолчанию, вам необходимо войти в систему с помощью этой команды:
$(AWS_PROFILE=<YOUR PROFILE> aws ecr get-login --no-include-email --region eu-west-1)