Не удается отправить изображение в 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

Отправьте свое изображение в репо

  1. Отметьте свое изображение

    тег докера <aws_account_id>.dkr.ecr..amazonaws.com / my-web-app

  2. Отправьте свое изображение с помощью следующей команды.

    docker push <aws_account_id>.dkr.ecr..amazonaws.com / my-web-app

Примечание: это логин на основе токена, и сгенерированный токен авторизации действителен только в течение 12 часов.

  1. Убедитесь, что вы сначала создали реестр ECR.
    Затем, в соответствии с инструкциями команды ECR Push, вырежьте и вставьте следующие команды
  2. Выполните команду входа в систему docker (eval в Mac/Linux пропускает вырезание и вставку)
    eval $(aws ecr get-login --region us-east-1)
    добавить --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 являются временными и истекает.

В 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.

Я боролся с тем же самым. Пожалуйста, выполните следующие шаги -

  1. aws configure (настройте с вашими учетными данными)
  2. Если вы создали репозиторий ECR, в консоли вы можете найти кнопку «просмотреть команды push». Вы получите там три команды и сможете нажимать. Иначе, вот три команды ниже.
  3. aws ecr get-login-password --region | docker login --username AWS --password-stdin .dkr.ecr.us-west-2.amazonaws.com
  4. создайте свой образ докера - docker build -t.
  5. тег докера: последний .dkr.ecr.us-west-2.amazonaws.com /: последний
  6. 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)
Другие вопросы по тегам