Не удается отправить изображение в Amazon ECR - происходит сбой без «базовых учетных данных»

174

Я пытаюсь вставить образ докера в реестр 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 были правильные разрешения. Я также позаботился о том, чтобы репозиторий позволил этому пользователю перейти на него. Просто чтобы убедиться, что это не проблема, я настроил реестр, чтобы предоставить всем пользователям полный доступ. Ничто не меняет "no basic auth credentials"ошибку. Я не знаю, как начать отлаживать это, так как весь трафик зашифрован.

ОБНОВИТЬ

Так что у меня был момент Гомера Симпсона Д'О, когда я понял основную причину моей проблемы. У меня есть доступ к нескольким аккаунтам AWS. Даже при том, что я использовал, aws configureчтобы установить свои учетные данные для учетной записи, где я настроил свой репозиторий, aws cli фактически использовал переменные среды AWS_ACCESS_KEY_IDи AWS_SECRET_ACCESS_KEY. Поэтому, когда я aws ecr get-loginэто делал, возвращался логин для неправильной учетной записи. Я не заметил, что номера счетов были другими, пока не вернулся, чтобы попробовать некоторые из предложенных ответов. Когда я удаляю переменные окружения, все работает правильно. Я предполагаю, что девиз этой истории - если вы нажмете эту ошибку, убедитесь, что репозиторий, в который вы входите, соответствует тегу, который вы применили к изображению.

Алек Руни
источник
10
Вы должны сделать это обновление жирным, подчеркнутым и курсивом. У меня также был момент Гомера Симпсона. Спасибо!
Майк
Спасибо за сужение! Вы спасли мой день буквально!
Симонсо
2
Та же ошибка выдается, когда хранилище не существует. Проверьте, создали ли вы репо в нужном регионе.
Илья Сидоренко
Обратите внимание, что вы можете настроить aws cli для работы с несколькими профилями пользователей: docs.aws.amazon.com/cli/latest/userguide/…
Питер Берг,

Ответы:

111

если вы запустите, $(aws ecr get-login --region us-east-1)все будет сделано за вас

Антонио Террено
источник
17
Ты легенда. Руководство AWS состояло из 5 шагов, все из которых были выполнены с помощью команды оболочки, за исключением шага 2, который говорит только: «Запустите команду входа в систему docker, которая была возвращена на предыдущем шаге». Я предполагаю, что целая куча таких людей, как я, просто сосредоточились на команде оболочки и не прочитали инструкцию должным образом
Динь
Машина времени. Почему перенос команды aws в $ () приводит к успешному входу в систему?
VtoCorleone
6
@VtoCorleone Поскольку команда aws просто печатает команду docker в стандартный вывод. Если вы заключите эту строку в $ (), она будет интерпретирована оболочкой, и docker loginкоманда будет выполнена.
Отавио Маседо
2
$ (aws ecr get-login --region us-west-2) неизвестный сокращенный флаг: 'e' in -e См. 'docker login --help'.
Ашиш Карпе
23
если вы получаете "неизвестный сокращенный флаг: 'e'", вы должны выполнить команду с флагом --no-include-email следующим образом: $ (aws ecr get-login --region us-east-1 - no-include-email)
Трентон
57

В моем случае это была ошибка в Docker для Windows и их поддержке диспетчера учетных данных Windows.

Откройте свой ~/.docker/config.jsonи удалите "credsStore": "wincred"запись.

Это приведет к тому, что учетные данные будут записаны config.jsonнапрямую. Вы должны будете войти снова после этого.

Вы можете отследить эту ошибку через билеты # 22910 и # 24968 на GitHub.

Der Hochstapler
источник
Спасибо - сработало в Windows 10. После удаления этого свойства из конфигурации и повторного запуска команды входа в docker, файл конфигурации был обновлен с учетными данными, и push работал.
Кэмерон
Я не могу найти файл конфигурации. Можете ли вы предложить мне расположение файла config.json?
Рамашенкер Трипати
@RamashankerTripathi Место находится в ответе. Я не уверен, как я мог быть более ясным.
Der Hochstapler
@OliverSalzburg Спасибо за ответ. На самом деле мой установочный каталог Docker не содержит файл config.json.
Рамашенкер Трипати
@RamashankerTripathi ~/.dockerозначает .dockerв вашем домашнем каталоге. Попробуйте%HOMEDRIVE%%HOMEPATH%\.docker
Der Hochstapler
50

Если вы используете профили, не забудьте перейти --profile=XXXна aws ecr get-login.

Greg
источник
27

У меня тоже была эта проблема. Что случилось со мной, я забыл выполнить команду, которая была возвращена мне после того, как я побежал

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
James111
источник
1
Я понятия не имел, что это был за ответ, поэтому я проигнорировал его. ха - ха. Спасибо за указание на это!
duyn9uyen
15

Это должно было работать даже без открытия разрешений. Смотрите документацию: Аутентификация частного реестра .

[Правка: на самом деле, у меня тоже были проблемы с разрешениями при выполнении второго теста. Посмотрите, как 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
fazy
источник
Как ты вставил очень длинный пароль ??? У меня есть несколько строк. Я использую терминал быстрого запуска Windows Docker, который, кажется, не имеет хороших возможностей копирования / вставки, или, возможно, я просто не могу понять это.
Дэвид
Кому-то еще интересно, мне просто нужно было пометить и скопировать все это, включая пробелы, и затем вставить это в Блокнот. Оттуда я удаляю разрывы строк и переписываю все, и только тогда я могу вставить в командную строку терминала. Это сработало.
Дэвид
Если вы используете PowerShell, перейдите на вкладку «Свойства»> «Параметры» и выберите «Включить выбор переноса строк». Таким образом, вы можете щелкнуть и перетащить, чтобы выбрать обернутые строки без необходимости ручного копирования в Блокнот, удаления новых строк и т. Д.
adarshr
Я не прикасался к машине с Windows почти 10 лет, но вы всегда можете направить стандартный вывод в файл: aws ecr get-authorization-token > config.jsonа затем открыть его в своем любимом текстовом редакторе, чтобы скопировать и вставить по желанию
стр.
13

Попробуйте с:

eval $(aws ecr get-login --no-include-email | sed 's|https://||')

до толчка.

MrMins
источник
Я получил этоno basic auth credentials Invalid IPv6 URL
Тхань Нгуен Ван
13

Обновить

Поскольку AWS CLI версии 2 - 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

Омри Зобель
источник
Я получаюunknown flag: --region
Kittu
11

Если это кому-нибудь поможет ...

Моя проблема заключалась в том, что мне пришлось использовать эту --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

Надеюсь, что это помогает кому-то!

Лансана Камара
источник
1
Ты спас меня! Я использовал свой профиль aws вот так, AWS_PROFILE=myprofile aws ecr get-loginи это не сработало, но введение профиля aws с --profileаргументом делает хитрость!
Коло Гидини
8

Существует известная ошибка в диспетчере учетных данных 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

Смотрите также страницу устранения неполадок .

Том Рейнджес
источник
8

Я испытал ту же проблему.

Создание новых учетных данных AWS (ключей доступа) и перенастройка интерфейса командной строки AWS с новыми учетными данными позволили решить эту проблему.

Ранее aws ecr get-login --region us-east-1сгенерированная команда входа в Docker с недействительным URL-адресом реестра EC.

temasso
источник
То же самое случилось со мной. Спасибо!
Greendrake
Это была моя проблема. У меня были другие учетные данные CLI AWS, хранящиеся в ~ / .aws / учетные данные, чем у aws, которым я управлял. Воссоздали новые учетные данные и настройки, которые работали.
Мартин Альгестен
6

В Windows в PowerShell используйте:

Invoke-Expression $(aws ecr get-login --no-include-email)
Игорь Аккерман
источник
это все еще актуально
Chappie Johnson
5

У меня возникла эта проблема по другой причине: мне нужно было перейти в реестр, не связанный с моей учетной записью 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работает просто отлично.

Джейсон Кларк
источник
это имеет смысл. Но что вы должны пройти в --profile? У меня есть личный аккаунт, но я пытаюсь перейти на корпоративный аккаунт. Другими словами, где я могу найтиprofilename
Ciprian Tomoiagă
1
@ CiprianTomoiagă, вы должны быть в том числе, если вы используете именованные профили. Смотрите здесь docs.aws.amazon.com/cli/latest/userguide/…
Серхио,
5
  1. Убедитесь, что вы сначала создали реестр ECR.
    Затем, в соответствии с инструкциями команды ECR Push, вырежьте и вставьте следующие команды
  2. Выполните команду docker login (eval в Mac / Linux пропускает вырезание и вставку)
    eval $(aws ecr get-login --region us-east-1)
    add --profile, если вы используете несколько учетных записей AWS
    eval $(aws ecr get-login --region us-east-1 --profile your-profile)
  3. docker build -t image-name .
  4. docker tag image-name:latest ############.dkr.ecr.us-east-1.amazonaws.com/image-name:latest
  5. docker push ############.dkr.ecr.us-east-1.amazonaws.com/image-name:latest

В случае ошибки, убедитесь, что вы запустите все команды снова! Учетные данные, которые вы используете, aws ecr get-loginявляются временными и истекают.

Джейсон
источник
где я могу найти что поставить your-profile?
Энди
Вы можете оставить это, если вы используете профиль по умолчанию
Jason
Я пытался выяснить, как не использовать профиль по умолчанию. Я понял это, хотя, дополнительные профили могут быть введены в ~/.aws/configи ~/.aws/credentialsфайлах.
Энди
5

В моем случае после запуска aws ecr get-login --no-include-email --region *****я просто скопировал вывод этой команды в виде docker login -u *** -p ************, и вы вставили его в подсказку. Толчок пошел вперед.

Жюльен Нямбал
источник
4

Документы AWS говорят вам выполнить следующую команду (для региона ap-southeast-2)

aws ecr get-login --region ap-southeast-2

Когда я столкнулся с этой проблемой, мне не было понятно, исходя из этих документов, что вам нужно ввести результат этой команды в терминал и выполнить его.

Исправление, которое работало для меня, было копировать результат в буфер обмена с

aws ecr get-login --region ap-southeast-2 | pbcopy

Вставьте результат в командную строку и выполните его

Дэн Грох
источник
4

После запуска этой команды:

(aws ecr get-login --no-include-email --region us-west-2)

просто запустите команду docker login из вывода

docker login -u AWS -p epJ....

способ входа Docker в ECR

Хавьер Родригес
источник
3

Эта ошибка обычно выдается, если сбой входа в систему ecr. Я использую систему Windows, и я использовал «Powershell» в режиме администратора, чтобы войти в систему, чтобы начать сначала.

Invoke-Expression $(aws ecr get-login --no-include-email)

Это должно вывести «Войти успешно».

kumarras
источник
Спасибо! почему это помогло? я уже входил в систему, используя saml2aws.
втекающий
2

Я столкнулся с той же самой проблемой, и ошибка, которую я сделал, использовала неправильный путь репо

например: docker push xxxxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/jenkins:latest

В вышеупомянутом пути я совершил ошибку: "dkr.ecr.us-east-1.amazonaws.com"вместо "west". Я использовал " east". Как только я исправил свою ошибку, я смог успешно нажать на изображение.

Картик Ви
источник
2

Команда 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.comnot 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://||')

После того, как вы запустите команду, вы получите 'Login Succeeded'сообщение, и после этого у вас все
получится.

Дакшин Раджавель
источник
2

Существует очень простой способ передачи образов докеров в ECR: Amazon ECR Docker Credential Helper . Просто установите его в соответствии с предоставленным руководством, обновите ~/.docker/config.jsonего следующим образом:

{
    "credsStore": "ecr-login"
}

и вы сможете нажимать / тянуть свои изображения без docker login.

Cepr0
источник
Я получил ту же ошибку после следования инструкциям в этой статье.
Речус
1

Я столкнулся с этой проблемой, а также работает на OSX. Я увидел ответ Оливера Зальцбурга и проверил мой ~ / .docker / config.json. Внутри него было несколько учетных данных авторизации от разных учетных записей AWS, которые у меня есть. Я удалил файл и после запуска get-login он снова заработал.

Минь Чан
источник
1

Убедитесь, что вы используете правильный регион aws ecr get-login, он должен совпадать с регионом, в котором создается ваш репозиторий.

Лех Мигдал
источник
1

У меня была проблема с несколькими учетными данными AWS; по умолчанию и dev. Так как я пытался развернуть в dev это сработало:

$(aws ecr get-login --no-include-email --region eu-west-1 --profile dev | sed 's|https://||')
hfogel
источник
1

FWIW, Debian 9, Docker версия 18.06.1-ce, сборка e68fc7a:

$(aws ecr get-login | sed 's| -e none | |g')

Ligemer
источник
1

Если вы используете несколько профилей и вам нужно войти в профиль, который не является профилем по умолчанию, вам необходимо войти в систему с помощью этой команды:

$(AWS_PROFILE=<YOUR PROFILE> aws ecr get-login --no-include-email --region eu-west-1)
zlandorf
источник
1

У меня работает следующая команда:

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
Чираг Калал
источник
0

Мы также столкнулись с этой проблемой сегодня и перепробовали все, что упомянуто в этом посте (кроме генерации учетных данных AWS).

Мы, наконец, решили проблему, просто обновив Docker, и тогда сработало.

Проблема возникла с Docker 1.10.x и была решена с помощью Docker 1.11.x.

Надеюсь это поможет

Баптист Гайяр
источник
0

Если вы изолируете Учетные записи AWS для целей CI / CD и имеете один репозиторий ECR, общий для нескольких учетных записей AWS, возможно, вам придется изменить ~/.docker/config.json вручную.

Допустим, у вас есть эти настройки:

  1. ECR принадлежит идентификатору учетной записи AWS 00000000000000
  2. Сервер CI принадлежит идентификатору учетной записи AWS 99999999999999

Если вы позвоните aws ecr get-login --region us-west-2 | bashв свой CI-сервер, Docker сгенерирует временные учетные данные в ~/.docker/config.json.

{
  "auths": {
    "https://99999999999999.dkr.ecr.us-west-2.amazonaws.com": {
      "auth": "long-token.."
    }
  }
}

Но вы хотите указать на учетную запись ECR, поэтому вам нужно изменить имя хоста.

{
  "auths": {
    "https://00000000000000.dkr.ecr.us-west-2.amazonaws.com": {
      "auth": "long-token.."
    }
  }
}

Обратите внимание, что эта ситуация зависит от того, как вы формируете пользователя / политику IAM для предоставления доступа к ECR.

tomodian
источник
0
aws ecr get-login --region us-west-1 --no-include-email

Эта команда дает мне правильную команду для входа в систему. Если вы не используете «--no-include-email», это вызовет еще одну ошибку. Выходные данные вышеупомянутой команды выглядят так: вход в докер -u AWS -p ********************** очень большой ******. Скопируйте это и выполните это. Теперь он покажет «Войти успешно». Теперь вы можете перенести свое изображение в ECR.

Убедитесь, что ваше правило AMI имеет разрешение для пользователя, которого вы пытались войти.

Омар Фарок Аник
источник