Неможливо наштовхнути зображення на Amazon ECR - не працює з "відсутністю основних авторизованих даних"


173

Я намагаюся підштовхнути зображення докера до реєстру Amazon ECR. Я використовую docker client Docker версії 1.9.1, build 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
Ви повинні зробити це оновлення жирним, підкресленим та виділеним курсивом. У мене теж був той момент Гомера Сімпсона. Дякую!
Майк

Дякуємо, що звузили його! Ти врятував мій день буквально!
simonso

2
Така ж помилка є і тоді, коли сховище не існує. Перевірте, чи створили репо в потрібному регіоні.
Ілля Сидоренко


Зауважте, що ви можете налаштувати aws cli для обробки декількох профілів користувачів: docs.aws.amazon.com/cli/latest/userguide/…
Пітер Берг

Відповіді:


111

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


17
Ти легенда. Посібник AWS мав 5 кроків із командою оболонки, крім кроку 2, де написано лише "Запустіть команду входу в докер, яка була повернута на попередньому кроці". Я думаю, ціла купа людей, як я, просто зосередилася на команді оболонки і не прочитала інструкцію належним чином
Tien Dinh

Машина часу - Чому загортання команди aws в $ () призводить до правильного успіху входу?
VtoCorleone

6
@VtoCorleone Оскільки команда aws просто друкує команду docker на стандартний вихід. Якщо ви обернете цей рядок у $ (), він буде інтерпретований оболонкою і docker loginкоманда буде виконуватися.
Отавіо Македо

2
$ (aws ecr get-login --region us-west-2) невідомий прапор стенограми: 'e' in -e Див. 'вхід докера --help'.
Ашиш Карпе

23
якщо ви отримуєте "невідомий скорочений прапор: 'e" ", ви повинні запустити команду з --no-include-email прапор таким чином: $ (aws ecr get-login --region us-east-1 - без включення електронної пошти)
Трентон,

57

У моєму випадку це була помилка з Docker для Windows та їх підтримка для Windows Credential Manager.

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

Це призведе до того, що облікові дані будуть записані config.jsonбезпосередньо. Після цього вам доведеться знову увійти.

Ви можете відстежити цю помилку за допомогою квитків №22910 та №24968 на GitHub.


Спасибі - працював у Windows 10. Після вилучення цього властивості з конфігурації та повторного запуску команди входу в докер, конфігураційний файл було оновлено обліковими записами, і натиск працював.
Кемерон

Я не в змозі знайти конфігураційний файл. Чи можете ви запропонувати мені розташування файлу config.json?
Рамашанкер Трипаті

@RamashankerTripathi Місце у відповідь. Я не впевнений, як я міг бути яснішим.
Der Hochstapler

@OliverSalzburg Дякую за відповідь. Насправді мій каталог встановлення Docker не містить файлу config.json.
Рамашанкер Трипаті

@RamashankerTripathi ~/.dockerозначає .dockerу вашому домашньому каталозі. Спробуйте%HOMEDRIVE%%HOMEPATH%\.docker
Der Hochstapler

50

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


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>

Скопіюйте та вставте цю команду, а потім запустіть свою команду push docker, яка виглядає приблизно так:

docker push 8888888.blah.blah.ap-southwest-1.amazonaws.com/dockerfilename

1
Я не мав уявлення, що це за реакція на кров, тому я її проігнорував. ха-ха. Дякуємо, що вказали на це!
duyn9uyen

14

Це мало працювати навіть без відкриття дозволів. Дивіться документацію: Аутентифікація приватного реєстру .

[Редагувати: насправді у мене були проблеми з дозволом, коли я робив другий тест. Див. Поштовх Docker до приватного репо-репо AWS ECR з відмовою з неправильним формуванням JSON ).]

Тим не менш у мене була така ж проблема; Я не знаю чому, але я успішно використовував більш довгомотовий механізм аутентифікації, описаний в документах, для отримання-авторизації-маркера

Версії 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

Отримайте маркер auth ("пароль докера").

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

Як ви вставили дуже довгий пароль ??? Шахта - кілька ліній. Я використовую термінал для швидкого запуску Windows Docker, який, здається, не має хорошої можливості копіювання / вставки, або, можливо, я просто не можу це зрозуміти.
Девід

Щоб хтось не цікавився, мені просто довелося розмітити і скопіювати всю справу, включаючи пробіл, а потім вставити її в Блокнот. Звідти я видаляю розриви рядків і копіюю все, і лише після цього я можу вставити в командний рядок терміналу. Це спрацювало.
Девід

Якщо ви використовуєте PowerShell, перейдіть на вкладку Властивості> Параметри та виберіть "Увімкнути вибір обтікання рядків". Таким чином, ви можете натиснути та перетягнути, щоб вибрати загорнуті лінії, не копіюючи вручну в Блокнот, видаливши нові рядки тощо
adarshr

Я майже не торкався машини Windows майже 10 років, але ви завжди можете передати stdout до файлу: aws ecr get-authorization-token > config.jsonа потім відкрити його в улюбленому текстовому редакторі, щоб скопіювати та вставити за бажанням
pECT

13

Спробуйте:

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

перед натисканням.


Я зрозумів цеno basic auth credentials Invalid IPv6 URL
Thanh Nguyen Van

12

Оновлення

Оскільки 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

У мене виникло те саме питання.

Генерування нових облікових даних AWS (ключі доступу) та повторна конфігурація AWS CLI за допомогою нових облікових даних вирішили проблему.

Раніше aws ecr get-login --region us-east-1створена команда входу в докер з недійсною URL-адресою реєстру EC.


Те саме сталося і зі мною. Дякую!
Гріндраке

Це була моя проблема. У мене були інші облікові дані AWS CLI, що зберігаються в ~ / .aws / повноваженнях, ніж у керованих Aws. Відтворено нові облікові дані та налаштування, які спрацювали.
Мартін Алгестен


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 Command, виріжте та вставте наступні команди
  2. Виконайте команду входу в докер (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?
Енді

Ви можете залишити його, якщо використовуєте профіль за замовчуванням
Джейсон

Я намагався з'ясувати, як не використовувати профіль за замовчуванням. Я зрозумів, що все-таки додаткові профілі можна вводити у файли ~/.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 -u AWS -p epJ....

це спосіб входу докера в ECR


3

Ця помилка, як правило, викидається, якщо не вдалося ввійти в систему. Я використовую систему Windows, і я використовував "Powershell" в режимі адміністратора, щоб увійти в режим ecr.

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

Це повинно вивести "Вхід вдався".


спасибі! чому це допомогло? Я вже входив у систему за допомогою saml2aws.
впливовий

2

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

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

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


2

Команда докера, яку дає aws-cli, мало що ...

Під час використання входу докер докер зберігає сервер: пару ключів або у вашому брелоку, або у файлі ~ / .docker / config.json

Якщо він збереже ключ під https://7272727.dkr.ecr.us-east-1.amazonaws.comпошуком ключа під час натискання, не вдасться, тому що докер шукатиме сервер з ім'ям 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://||')

Після запуску команди ви отримаєте 'Login Succeeded'повідомлення, і тоді ви добре
після цього ваша push команда повинна спрацювати


2

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

{
    "credsStore": "ecr-login"
}

і ви зможете натискати / тягнути свої зображення без docker login.


Я отримав таку ж помилку після дотримання інструкцій у цій статті.
ryechus

1

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


1

Переконайтеся, що ви використовуєте правильний регіон у aws ecr get-login, він повинен відповідати регіону, в якому створено ваше сховище.


1

У моїй проблемі було наявність декількох облікових даних AWS; за замовчуванням та dev. Оскільки я намагався розгорнути розробник, це спрацювало:

$(aws ecr get-login --no-include-email --region eu-west-1 --profile dev | sed 's|https://||')


1

Якщо ви використовуєте кілька профілів і вам потрібно увійти в профіль, який не є вашим типовим, вам потрібно увійти за допомогою цієї команди:

$(AWS_PROFILE=<YOUR PROFILE> aws ecr get-login --no-include-email --region eu-west-1)

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



0
aws ecr get-login --region us-west-1 --no-include-email

Ця команда дає мені правильну команду для входу. Якщо ви не використовуєте "--no-include-email", це призведе до ще однієї помилки. Вихід з вищевказаної команди виглядає так, як цей вхід докер -u AWS -p ********************** дуже великий ******. Скопіюйте це та виконайте це. Тепер він покаже "Вхід вдався". Тепер ви можете підштовхнути своє зображення до ECR.

Переконайтеся, що ваше правило AMI має дозвіл для користувача, якого ви намагалися ввійти.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.