Nie można przesłać obrazu do Amazon ECR - niepowodzenie z „brakiem podstawowych danych uwierzytelniających”

173

Próbuję przesłać obraz dockera do rejestru Amazon ECR. Używam klienta Docker Docker w wersji 1.9.1, build a34a1d5. Używam, aws ecr get-login --region us-east-1aby uzyskać dane logowania do platformy Docker. Następnie pomyślnie loguję się za pomocą tych danych w następujący sposób:

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

Ale kiedy próbuję przesłać mój obraz, pojawia się następujący błąd:

$ 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

Upewniłem się, że użytkownik aws ma odpowiednie uprawnienia. Upewniłem się również, że repozytorium zezwala temu użytkownikowi na push. Aby upewnić się, że to nie problem, ustawiłem rejestr tak, aby umożliwić wszystkim użytkownikom pełny dostęp. Nic nie zmienia "no basic auth credentials"błędu. Nie wiem, jak zacząć to debugować, ponieważ cały ruch jest szyfrowany.

AKTUALIZACJA

Więc przeżyłem chwilę Homera Simpsona D'Oh, kiedy zdałem sobie sprawę z pierwotnej przyczyny mojego problemu. Mam dostęp do wielu kont AWS. Mimo że używałem aws configuredo ustawiania moich poświadczeń dla konta, na którym skonfigurowałem moje repozytorium, aws cli faktycznie korzystało ze zmiennych środowiskowych AWS_ACCESS_KEY_IDi AWS_SECRET_ACCESS_KEY. Więc kiedy to zrobiłem aws ecr get-login, zwracałem login do niewłaściwego konta. Nie zauważyłem, że numery kont są różne, dopóki nie wróciłem teraz, aby wypróbować niektóre z proponowanych odpowiedzi. Kiedy usuwam zmienne środowiskowe, wszystko działa poprawnie. Wydaje mi się, że motto tej historii brzmi: jeśli trafisz na ten błąd, upewnij się, że repozytorium, do którego się logujesz, pasuje do tagu, który zastosowałeś do obrazu.

Alec Rooney
źródło
10
Powinieneś uczynić tę aktualizację pogrubioną, podkreśloną i kursywą. Właśnie przeżyłem ten moment Homera Simpsona. Dziękuję Ci!
Mike
Dzięki za zawężenie! Dosłownie uratowałeś mi dzień!
simonso
2
Ten sam błąd pojawia się, gdy repozytorium nie istnieje. Sprawdź, czy utworzyłeś repozytorium w odpowiednim regionie.
Ilia Sidorenko
Pamiętaj, że możesz skonfigurować swoje kliknięcie aws do obsługi wielu profili użytkowników: docs.aws.amazon.com/cli/latest/userguide/ ...
Peter Berg

Odpowiedzi:

111

jeśli będziesz biegać, $(aws ecr get-login --region us-east-1)wszystko będzie zrobione za Ciebie

Antonio Terreno
źródło
17
Jesteś legendą. Przewodnik AWS zawierał 5 kroków, wszystkie z poleceniem powłoki, z wyjątkiem kroku 2, który mówi tylko „Uruchom polecenie logowania dockera, które zostało zwrócone w poprzednim kroku”. Chyba cały stos ludzi takich jak ja po prostu skupić się na polecenie powłoki i czy właściwie nie przeczytać instrukcję
Tien Dinh
Wehikuł czasu - Dlaczego zawijanie polecenia aws w $ () powoduje poprawne logowanie?
VtoCorleone
6
@VtoCorleone Ponieważ polecenie aws po prostu drukuje polecenie docker na standardowe wyjście. Jeśli zawiniesz ten ciąg w $ (), zostanie on zinterpretowany przez powłokę i docker loginpolecenie zostanie wykonane.
Otavio Macedo
2
$ (aws ecr get-login --region us-west-2) nieznana skrótowa flaga: 'e' in -e Zobacz 'docker login --help'.
Ashish Karpe,
23
jeśli otrzymujesz flagę "nieznanego skrótu": 'e' ", musisz uruchomić polecenie z flagą --no-include-email w ten sposób: $ (aws ecr get-login --region us-east-1 - e-mail bez dołączania)
Trenton
57

W moim przypadku był to błąd związany z Docker for Windows i ich obsługą dla Windows Credential Manager.

Otwórz ~/.docker/config.jsoni usuń "credsStore": "wincred"wpis.

Spowoduje to zapisanie poświadczeń config.jsonbezpośrednio do. Potem będziesz musiał się ponownie zalogować.

Możesz śledzić ten błąd za pomocą zgłoszeń nr 22910 i # 24968 na GitHub.

Der Hochstapler
źródło
Dzięki - działało na Windows 10. Po usunięciu tej właściwości z configu i ponownym uruchomieniu polecenia docker login, plik konfiguracyjny został zaktualizowany o poświadczenia, a funkcja push działała.
Cameron
Nie mogę znaleźć pliku konfiguracyjnego. Czy możesz mi zasugerować lokalizację pliku config.json?
Ramashanker Tripathi
@RamashankerTripathi Lokalizacja jest w odpowiedzi. Nie jestem pewien, jak mógłbym wyrazić się jaśniej.
Der Hochstapler
@OliverSalzburg Dzięki za odpowiedź. Właściwie mój katalog instalacyjny Dockera nie zawiera pliku config.json.
Ramashanker Tripathi
@RamashankerTripathi ~/.dockeroznacza .dockerw twoim katalogu domowym. Spróbuj%HOMEDRIVE%%HOMEPATH%\.docker
Der Hochstapler
50

Jeśli używasz profili, nie zapomnij przejść --profile=XXXdo aws ecr get-login.

Greg
źródło
27

Ja też miałem ten problem. To, co się ze mną stało, to to, że zapomniałem uruchomić polecenia, które wróciło do mnie po uruchomieniu

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

To polecenie zwróciło duży obiekt blob, który zawiera docker loginpolecenie właśnie tam! Nie zdawałem sobie sprawy. Powinien zwrócić coś takiego:

docker login -u AWS -p <your_token_which_is_massive> -e none <your_aws_url>

Skopiuj i wklej to polecenie, a następnie uruchom polecenie docker push, które wygląda mniej więcej tak:

docker push 8888888.blah.blah.ap-southwest-1.amazonaws.com/dockerfilename
James111
źródło
1
Nie miałem pojęcia, czym była ta odpowiedź, więc ją zignorowałem. ha ha. Dzięki za wskazanie tego!
duyn9uyen
14

Powinno to zadziałać nawet bez otwierania uprawnień. Zobacz dokumentację: Uwierzytelnianie rejestru prywatnego .

[Edytuj: tak naprawdę, miałem też problemy z uprawnieniami podczas wykonywania drugiego testu. Zobacz wypychanie platformy Docker do prywatnego repozytorium AWS ECR niepowodzeniem z powodu nieprawidłowego formatu JSON ).]

Niemniej jednak miałem ten sam problem; Nie wiem dlaczego, ale z powodzeniem użyłem bardziej długiego mechanizmu uwierzytelniania opisanego w dokumentacji dla get-authorisation token

Wersje AWS CLI i 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

Uzyskaj token uwierzytelniania („hasło docker”).

aws ecr get-authorization-token --region us-east-1 --output text \
    --query authorizationData[].authorizationToken | base64 -d | cut -d: -f2

Uwaga: Mój ~ / .aws / config określa inny domyślny region, więc musiałem jawnie ustawić --region us-east-1.

Zaloguj się interaktywnie (zmień ############swój identyfikator konta 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>

Wypchnij obraz (zakładając, że utworzyłeś obraz dockera 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
źródło
Jak wkleiłeś bardzo długie hasło ??? Mój jest kilka linii. Używam terminala Windows Docker Quickstart, który wydaje się nie mieć dobrych możliwości kopiowania / wklejania, a może po prostu nie mogę tego rozgryźć.
David
Dla każdego, kto się zastanawiał, musiałem po prostu zaznaczyć i skopiować całość, w tym spacje, a następnie wkleić to do Notatnika. Stamtąd usuwam podziały wierszy i ponownie kopiuję wszystko, a dopiero potem mogę wkleić do wiersza poleceń terminala. To się udało.
David
Jeśli używasz PowerShell, przejdź do Właściwości> zakładka Opcje i wybierz „Włącz zaznaczanie zawijania linii”. W ten sposób możesz kliknąć i przeciągnąć, aby zaznaczyć zawinięte linie bez konieczności ręcznego kopiowania do Notatnika, usuwania nowych wierszy itp.
adarshr
Nie dotykałem maszyny z systemem Windows od prawie 10 lat, ale zawsze możesz przesłać wyjście na stdout do pliku: aws ecr get-authorization-token > config.jsona następnie otworzyć go w swoim ulubionym edytorze tekstu, aby kopiować i wklejać do woli
pct
13

Spróbuj z:

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

przed pchnięciem.

MrMins
źródło
Mam tono basic auth credentials Invalid IPv6 URL
Thanh Nguyen Van
12

Aktualizacja

Od wersji AWS CLI 2 - aws ecr get-loginjest przestarzała, a poprawną metodą jest aws ecr get-login-password.

Dlatego poprawna i zaktualizowana odpowiedź jest następująca: docker login -u AWS -p $(aws ecr get-login-password --region us-east-1) xxxxxxxx.dkr.ecr.us-east-1.amazonaws.com

Omry Zobel
źródło
Dostajęunknown flag: --region
kittu
11

Jeśli to komuś pomoże ...

Mój problem polegał na tym, że musiałem skorzystać z --profileopcji, aby uwierzytelnić się za pomocą odpowiedniego profilu z pliku poświadczeń.

Następnie ominąłem --region [region_name]polecenie, które również powodowało błąd „brak podstawowych danych uwierzytelniających”.

Rozwiązaniem dla mnie była zmiana polecenia z tego:

aws ecr get-login

Do tego:

aws --profile [profile_name] ecr get-login --region [region_name]

Przykład:

aws --profile foo ecr get-login --region us-east-1

Mam nadzieję, że to komuś pomoże!

Lansana Camara
źródło
1
Uratowałeś mnie! Używałem mojego profilu aws w ten sposób AWS_PROFILE=myprofile aws ecr get-logini to nie zadziałało, ale wprowadzenie profilu aws z --profileargumentem sprawia, że ​​cała sprawa !
Colo Ghidini
8

W menedżerze poświadczeń wincred w systemie Windows występuje znany błąd. Usunięcie „https: //” z wygenerowanego polecenia logowania rozwiązuje ten problem.

docker login -u AWS -p <password> <aws_account_id>.dkr.ecr.<region>.amazonaws.com

zamiast

docker login -u AWS -p <password> https://<aws_account_id>.dkr.ecr.<region>.amazonaws.com

Zobacz także stronę rozwiązywania problemów .

Tom Rijntjes
źródło
8

Doświadczyłem tego samego problemu.

Wygenerowanie nowych poświadczeń AWS (kluczy dostępu) i rekonfiguracja interfejsu wiersza polecenia AWS z nowymi poświadczeniami rozwiązało problem.

Wcześniej aws ecr get-login --region us-east-1wygenerowano polecenie logowania do platformy docker z nieprawidłowym adresem URL rejestru WE.

temasso
źródło
To samo przytrafiło się mnie. Dzięki!
Greendrake
To był mój problem. Miałem inne dane uwierzytelniające AWS CLI przechowywane w ~ / .aws / credentials niż aws, którymi zarządzałem. Odtworzono nowe dane logowania i ustawienia, które działały.
Martin Algesten
6

W systemie Windows w programie PowerShell użyj:

Invoke-Expression $(aws ecr get-login --no-include-email)
Igor Akkerman
źródło
to jest nadal aktualne
Chappie Johnson
5

Miałem ten problem z inną przyczyną: musiałem wysłać do rejestru niezwiązanego z moim kontem AWS (rejestr klienta ECR). Klient udzielił mi dostępu na karcie Uprawnienia do rejestru, dodając mój identyfikator IAM (np. arn:aws:iam::{AWS ACCT #}:user/{Username}) Jako zleceniodawcę. Próbowałem się zalogować, wykonując zwykłe czynności:

$(aws ecr get-login --region us-west-2 --profile profilename)
docker push {Client AWS ACCT #}.dkr.ecr.us-west-1.amazonaws.com/imagename:latest

Co oczywiście zaowocowało no basic auth credentials. Jak się okazuje , aws ecr get-loginloguje Cię do ECR dla rejestru powiązanego z Twoim loginem , co ma sens z perspektywy czasu. Rozwiązaniem jest wskazanie, do aws ecr get-loginktórych rejestrów chcesz się zalogować.

$(aws ecr get-login --region us-west-2 --profile profilename --registry-ids {Client AWS ACCT #})

Potem docker pushdziała dobrze.

Jason Clark
źródło
to ma sens. Ale co należy przekazać w --profile? Mam konto osobiste, ale próbuję przekazać dane na konto firmowe. Innymi słowy, gdzie znajdęprofilename
Ciprian Tomoiagă
1
@ CiprianTomoiagă powinieneś to uwzględnić tylko wtedy, gdy używasz nazwanych profili. Zobacz tutaj docs.aws.amazon.com/cli/latest/userguide/…
Sergio
5
  1. Upewnij się, że najpierw utworzyłeś rejestr ECR.
    Następnie zgodnie z instrukcjami wypychania poleceń ECR wytnij i wklej następujące polecenia
  2. Wykonaj polecenie docker login (eval na Mac / Linux pomija wycinanie i wklejanie)
    eval $(aws ecr get-login --region us-east-1)
    add --profile, jeśli używasz wielu kont 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

W przypadku błędu upewnij się, że ponownie wykonałeś wszystkie polecenia! Poświadczenia, których używasz, aws ecr get-loginsą tymczasowe i wygasną.

Jason
źródło
gdzie znajdę się na co włożyć your-profile?
Andy
Możesz go pominąć, jeśli używasz domyślnego profilu
Jason
Próbowałem wymyślić, jak nie używać domyślnego profilu. Rozgryzłem to jednak, dodatkowe profile można wprowadzić do plików ~/.aws/configi ~/.aws/credentials.
Andy
5

W moim przypadku po uruchomieniu aws ecr get-login --no-include-email --region *****właśnie skopiowałem dane wyjściowe tego polecenia z formą docker login -u *** -p ************i wklejasz je w zachęcie. Parcie szło naprzód.

Julien Nyambal
źródło
4

Dokumenty AWS mówią, aby wykonać następujące polecenie (dla regionu ap-południowy wschód-2)

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

Kiedy natknąłem się na ten problem, nie było dla mnie jasne na podstawie tych dokumentów, że musisz wprowadzić wynik tego polecenia do terminala i wykonać go.

Naprawa, która działała dla mnie, polegała na skopiowaniu wyniku do schowka za pomocą

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

Wklej wynik do wiersza poleceń i wykonaj go

Dan Groch
źródło
4

Po uruchomieniu tego polecenia:

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

po prostu uruchom polecenie docker login z danych wyjściowych

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

to sposób, w jaki docker loguje się do ECR

Javier Rodriguez
źródło
3

Ten błąd jest generalnie generowany, jeśli logowanie ecr nie powiodło się. Używam systemu Windows i użyłem „Powershell” w trybie administratora, aby najpierw zalogować się do ecr.

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

Powinno to spowodować wyświetlenie komunikatu „Logowanie powiodło się”.

kumarras
źródło
Dziękuję Ci! dlaczego to pomogło? logowałem się już przy użyciu saml2aws.
wpływowy
2

Napotkałem ten sam problem i błąd, który popełniłem, polegał na użyciu niewłaściwej ścieżki repo

na przykład: docker push xxxxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/jenkins:latest

Na powyższej ścieżce popełniłem błąd: w "dkr.ecr.us-east-1.amazonaws.com"zamiast "west". Używałem east". ” Po poprawieniu błędu udało mi się pomyślnie przesunąć obraz.

karthik vee
źródło
2

Polecenie docker podane przez aws-cli jest trochę niedostępne ...

Używając logowania docker, docker zapisze parę server: key w twoim pęku kluczy lub w pliku ~ / .docker / config.json

Jeśli zapisze klucz w https://7272727.dkr.ecr.us-east-1.amazonaws.comwyszukiwaniu klucza podczas wypychania, zakończy się niepowodzeniem, ponieważ docker będzie szukał serwera o nazwie 7272727.dkr.ecr.us-east-1.amazonaws.comniehttps://7272727.dkr.ecr.us-east-1.amazonaws.com .

Użyj następującego polecenia, aby się zalogować:

eval $(aws ecr get-login --no-include-email --region us-east-1 --profile yourprofile | sed 's|https://||')

Po uruchomieniu polecenia otrzymasz 'Login Succeeded'wiadomość i wtedy są dobre
po że komenda Push powinno działać

Dakshin Rajavel
źródło
2

Istnieje bardzo prosty sposób przesyłania obrazów dockera do ECR: Amazon ECR Docker Credential Helper . Po prostu zainstaluj go zgodnie z dostarczonym przewodnikiem, zaktualizuj ~/.docker/config.jsonw następujący sposób:

{
    "credsStore": "ecr-login"
}

i będziesz mógł przesuwać / wyciągać obrazy bez docker login.

Cepr0
źródło
Otrzymałem ten sam błąd po wykonaniu instrukcji w tym artykule.
ryechus
1

Napotkałem ten problem również na OSX. Widziałem odpowiedź Olivera Salzburga i sprawdziłem mój plik ~ / .docker / config.json. Zawierał wiele poświadczeń autoryzacyjnych z różnych kont AWS, które mam. Usunąłem plik i po ponownym uruchomieniu get-login zadziałało.

Minh Tran
źródło
1

Upewnij się, że używasz właściwego regionu w aws ecr get-login, musi on odpowiadać regionowi, w którym zostało utworzone repozytorium.

Lech Migdal
źródło
1

Mój problem polegał na posiadaniu wielu poświadczeń AWS; default i dev. Ponieważ próbowałem wdrożyć program, zadziałało:

$(aws ecr get-login --no-include-email --region eu-west-1 --profile dev | sed 's|https://||')
hfogel
źródło
1

FWIW, Debian 9, Docker wersja 18.06.1-ce, kompilacja e68fc7a:

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

Ligemer
źródło
1

Jeśli używasz wielu profili i chcesz zalogować się do profilu, który nie jest Twoim domyślnym, musisz zalogować się za pomocą tego polecenia:

$(AWS_PROFILE=<YOUR PROFILE> aws ecr get-login --no-include-email --region eu-west-1)
zlandorf
źródło
1

Działa dla mnie następujące polecenie:

sudo $(aws ecr get-login --region us-east-1 --no-include-email)

Następnie uruchamiam te polecenia:

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
Chirag Kalal
źródło
0

również dzisiaj napotykamy ten problem i próbowaliśmy wszystkiego, o czym wspomniano w tym poście (oprócz generowania poświadczeń AWS).

W końcu rozwiązaliśmy problem, po prostu uaktualniając Dockera, a następnie polecenie zadziałało.

Problem wystąpił w Docker 1.10.x i został rozwiązany w Docker 1.11.x.

Mam nadzieję że to pomoże

Baptiste Gaillard
źródło
0

Jeśli izolujesz konta AWS do celów CI / CD i masz jedno repozytorium ECR współużytkowane przez wiele kont AWS, może być konieczna ~/.docker/config.jsonręczna zmiana .

Załóżmy, że masz te konfiguracje:

  1. ECR jest własnością AWS Account ID 00000000000000
  2. Serwer CI jest własnością AWS Account ID 99999999999999

Jeśli zadzwonisz aws ecr get-login --region us-west-2 | bashw ramach serwera CI, docker wygeneruje tymczasowe poświadczenia w ~/.docker/config.json.

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

Ale chcesz wskazać konto ECR, więc musisz zmienić nazwę hosta.

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

Zwróć uwagę, że ta sytuacja zależy od tego, w jaki sposób tworzysz użytkownika / politykę IAM, aby zezwolić na dostęp ECR.

tomodian
źródło
0
aws ecr get-login --region us-west-1 --no-include-email

To polecenie daje mi prawidłowe polecenie logowania. Jeśli nie użyjesz „--no-include-email”, pojawi się kolejny błąd. Wynik powyższego polecenia wygląda następująco: login dockera -u AWS -p ********************** bardzo duży ******. Skopiuj to i wykonaj. Teraz wyświetli się komunikat „Logowanie powiodło się”. Teraz możesz przesłać swój obraz do ECR.

Upewnij się, że Twoja reguła AMI ma uprawnienia użytkownika, z którym próbujesz się zalogować.

Omar Faroque Anik
źródło