Bild kann nicht an Amazon ECR übertragen werden - schlägt fehl, wenn keine grundlegenden Authentifizierungsdaten vorhanden sind.


172

Ich versuche, ein Docker-Image in eine Amazon ECR-Registrierung zu verschieben. Ich verwende Docker Client Docker Version 1.9.1, Build a34a1d5. Ich benutze aws ecr get-login --region us-east-1, um die Docker-Login-Creds zu bekommen. Dann logge ich mich erfolgreich wie folgt mit diesen Creds ein:

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

Wenn ich jedoch versuche, mein Bild zu verschieben, wird der folgende Fehler angezeigt:

$ 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

Ich habe sichergestellt, dass der aws-Benutzer die richtigen Berechtigungen hat. Ich habe auch sichergestellt, dass das Repository dem Benutzer erlaubt, darauf zu pushen. Um sicherzugehen, dass dies kein Problem ist, habe ich die Registrierung so eingestellt, dass alle Benutzer vollen Zugriff haben. Nichts ändert den "no basic auth credentials"Fehler. Ich weiß nicht, wie ich mit dem Debuggen beginnen soll, da der gesamte Datenverkehr verschlüsselt ist.

AKTUALISIEREN

Ich hatte also ein bisschen Homer Simpson D'Oh-Moment, als ich die Grundursache meines Problems erkannte. Ich habe Zugriff auf mehrere AWS-Konten. Obwohl ich aws configuremeine Anmeldeinformationen für das Konto festgelegt habe, in dem ich mein Repository eingerichtet hatte, verwendete die aws cli tatsächlich die Umgebungsvariablen AWS_ACCESS_KEY_IDund AWS_SECRET_ACCESS_KEY. Als ich das tat aws ecr get-login, gab ich ein Login für das falsche Konto zurück. Ich habe nicht bemerkt, dass die Kontonummern unterschiedlich waren, bis ich jetzt zurückgegangen bin, um einige der vorgeschlagenen Antworten auszuprobieren. Wenn ich die Umgebungsvariablen entferne, funktioniert alles korrekt. Ich denke, das Motto der Geschichte lautet: Wenn Sie auf diesen Fehler stoßen, stellen Sie sicher, dass das Repository, in das Sie sich einloggen, mit dem Tag übereinstimmt, das Sie auf das Bild angewendet haben.


10
Sie sollten dieses Update fett, unterstrichen und kursiv schreiben. Ich hatte auch gerade diesen Homer Simpson Moment. Danke dir!
Mike

Danke, dass du es eingegrenzt hast! Du hast meinen Tag buchstäblich gerettet!
Simonso

2
Der gleiche Fehler wird angezeigt, wenn das Repository nicht vorhanden ist. Überprüfen Sie, ob Sie das Repo in der richtigen Region erstellt haben.
Ilia Sidorenko


Beachten Sie, dass Sie Ihre aws cli so einrichten können, dass sie mehrere Benutzerprofile verarbeitet: docs.aws.amazon.com/cli/latest/userguide/…
Peter Berg

Antworten:


109

Wenn Sie ausführen $(aws ecr get-login --region us-east-1), wird alles für Sie erledigt


17
Du bist eine Legende. Das AWS-Handbuch hatte 5 Schritte, alle mit einem Shell-Befehl, mit Ausnahme von Schritt 2, in dem nur "Führen Sie den Docker-Anmeldebefehl aus, der im vorherigen Schritt zurückgegeben wurde" aus. Ich denke, ein ganzer Haufen Leute wie ich konzentriert sich nur auf den Shell-Befehl und hat die Anweisung nicht richtig gelesen
Tien Dinh

Zeitmaschine - Warum führt das Umschließen des Befehls aws in $ () dazu, dass die Anmeldung korrekt erfolgreich ist?
VtoCorleone

6
@VtoCorleone Da der Befehl aws nur einen Docker-Befehl in die Standardausgabe druckt. Wenn Sie diesen String in $ () einschließen, wird er von der Shell interpretiert und der docker loginBefehl ausgeführt.
Otavio Macedo

2
$ (aws ecr get-login --region us-west-2) unbekannte Kurzschrift: 'e' in -e Siehe 'Docker Login --help'.
Ashish Karpe

22
Wenn Sie das "unbekannte Kurzschrift-Flag: 'e'" erhalten, müssen Sie den Befehl mit dem Flag --no-include-email wie folgt ausführen: $ (aws ecr get-login --region us-east-1 - No-Include-E-Mail)
Trenton

57

In meinem Fall war dies ein Fehler bei Docker für Windows und deren Unterstützung für den Windows Credential Manager.

Öffnen Sie Ihre ~/.docker/config.jsonund entfernen Sie den "credsStore": "wincred"Eintrag.

Dadurch werden Anmeldeinformationen config.jsondirekt in die geschrieben . Sie müssen sich danach erneut anmelden.

Sie können diesen Fehler über die Tickets Nr. 22910 und Nr. 24968 auf GitHub verfolgen .


Danke - arbeitete unter Windows 10. Nachdem diese Eigenschaft aus der Konfiguration entfernt und der Docker-Anmeldebefehl erneut ausgeführt wurde, wurde die Konfigurationsdatei mit Anmeldeinformationen aktualisiert und Push funktionierte.
Cameron

Ich kann die Konfigurationsdatei nicht finden. Können Sie mir bitte den Speicherort der Datei config.json vorschlagen?
Ramashanker Tripathi

@ RamashankerTripathi Der Ort ist in der Antwort. Ich bin mir nicht sicher, wie ich klarer sein könnte.
Der Hochstapler

@OliverSalzburg Danke für die Antwort. Tatsächlich enthält mein Docker-Installationsverzeichnis keine Datei config.json.
Ramashanker Tripathi

@ RamashankerTripathi ~/.dockerbedeutet .dockerin Ihrem Home-Verzeichnis. Versuchen Sie%HOMEDRIVE%%HOMEPATH%\.docker
Der Hochstapler

50

Wenn Sie Profile verwenden, vergessen Sie nicht passieren --profile=XXXzu aws ecr get-login.


27

Ich hatte auch dieses Problem. Was mit mir passiert ist, war, dass ich vergessen habe, den Befehl auszuführen, der mir nach dem Ausführen zurückgegeben wurde

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

Dieser Befehl hat einen großen Blob zurückgegeben, der den docker loginBefehl genau dort enthält! Ich habe es nicht bemerkt. Es sollte ungefähr so ​​etwas zurückgeben:

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

Kopieren Sie diesen Befehl, fügen Sie ihn ein und führen Sie dann Ihren Docker-Push-Befehl aus, der ungefähr so ​​aussieht:

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

1
Ich hatte keine Ahnung, was diese Blob-Antwort war, also ignorierte ich sie. Haha. Vielen Dank für den Hinweis!
duyn9uyen

14

Dies hätte auch ohne Öffnen der Berechtigungen funktionieren müssen. Siehe die Dokumentation: Private Registry-Authentifizierung .

[Bearbeiten: Eigentlich hatte ich auch Berechtigungsprobleme, als ich einen zweiten Test machte. Siehe Docker Push to AWS ECR Private Repo, das mit fehlerhaftem JSON fehlschlägt .]

Trotzdem hatte ich das gleiche Problem; Ich weiß nicht warum, aber ich habe erfolgreich den langwierigeren Authentifizierungsmechanismus verwendet, der in den Dokumenten für das Get-Authorization-Token beschrieben ist

AWS CLI- und Docker-Versionen:

$ 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

Holen Sie sich das Auth-Token ('Docker-Passwort').

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

Hinweis: Mein ~ / .aws / config gibt einen anderen Standardbereich an, daher musste ich explizit festlegen --region us-east-1.

Melden Sie sich interaktiv an (ändern Sie ############Ihre AWS-Konto-ID):

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>

Push ein Bild (vorausgesetzt, Sie haben ein Docker-Bild erstellt 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

Wie hast du das sehr lange Passwort eingefügt ??? Meins ist mehrere Zeilen. Ich verwende das Windows Docker-Schnellstart-Terminal, das anscheinend keine gute Kopier- / Einfügefunktion bietet, oder ich kann es einfach nicht herausfinden.
David

Für alle anderen, die sich wunderten, musste ich nur das Ganze markieren und kopieren, einschließlich Leerzeichen, und es dann in Notepad einfügen. Von dort entferne ich die Zeilenumbrüche und kopiere alles neu. Erst dann kann ich sie in die Terminal-Befehlszeile einfügen. Das hat funktioniert.
David

Wenn Sie PowerShell verwenden, gehen Sie zu Eigenschaften> Registerkarte Optionen und wählen Sie "Zeilenumbruchauswahl aktivieren". Auf diese Weise können Sie klicken und ziehen, um die umbrochenen Zeilen auszuwählen, ohne manuell in den Editor kopieren, neue Zeilen löschen usw.
Adarshr

Ich habe seit fast 10 Jahren keine Windows-Maschine mehr berührt, aber Sie können stdout immer in eine Datei aws ecr get-authorization-token > config.json
leiten

13

Versuche es mit:

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

vor dem drücken.


Ich habe dasno basic auth credentials Invalid IPv6 URL
Thanh Nguyen Van

11

Wenn es jemandem hilft ...

Mein Problem war, dass ich die --profileOption verwenden musste, um mich mit dem richtigen Profil aus der Anmeldeinformationsdatei zu authentifizieren.

Als nächstes hatte ich den --region [region_name]Befehl ausgelassen , der auch den Fehler "Keine grundlegenden Authentifizierungsdaten" ergab.

Die Lösung für mich bestand darin, meinen Befehl von diesem zu ändern:

aws ecr get-login

Dazu:

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

Beispiel:

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

Hoffe das hilft jemandem!


1
Du hast mich gerettet! Ich habe mein aws-Profil so verwendet, AWS_PROFILE=myprofile aws ecr get-loginund es hat nicht funktioniert, aber die Einführung des aws-Profils mit --profileArgumenten macht den Trick!
Colo Ghidini

11

Aktualisieren

Da AWS CLI Version 2 - aws ecr get-loginveraltet ist und die richtige Methode ist aws ecr get-login-password.

Daher lautet die richtige und aktualisierte Antwort wie folgt: docker login -u AWS -p $(aws ecr get-login-password --region us-east-1) xxxxxxxx.dkr.ecr.us-east-1.amazonaws.com


8

Es gibt einen bekannten Fehler im Wincred Credential Manager unter Windows. Das Entfernen von 'https: //' aus dem generierten Anmeldebefehl löst dieses Problem.

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

anstatt

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

Siehe auch die Seite zur Fehlerbehebung .


8

Ich habe das gleiche Problem erlebt.

Durch das Generieren neuer AWS-Anmeldeinformationen (Zugriffsschlüssel) und das Neukonfigurieren der AWS-CLI mit neuen Anmeldeinformationen wurde das Problem behoben.

Zuvor aws ecr get-login --region us-east-1generierter Docker-Anmeldebefehl mit ungültiger EC-Registrierungs-URL.


Das gleiche ist mir passiert. Vielen Dank!
Greendrake

Das war mein Problem. In den ~ / .aws / Anmeldeinformationen waren andere AWS CLI-Anmeldeinformationen gespeichert als in den von mir verwalteten aws. Neue Anmeldeinformationen und Einstellungen wurden wiederhergestellt, die funktionierten.
Martin Algesten

5

Ich hatte dieses Problem aus einem anderen Grund: Ich musste auf eine Registrierung pushen, die nicht mit meinem AWS-Konto verknüpft ist (die ECR-Registrierung eines Kunden). Der Client hat mir Zugriff auf der Registerkarte Berechtigungen für die Registrierung gewährt, indem er meine IAM-ID (z. B. arn:aws:iam::{AWS ACCT #}:user/{Username}) als Principal hinzugefügt hat . Ich habe versucht, mich mit den üblichen Schritten anzumelden:

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

Was natürlich dazu führte no basic auth credentials. Wie sich herausstellt , aws ecr get-loginmelden Sie sich bei der ECR für die Registrierung an, die Ihrem Login zugeordnet ist , was im Nachhinein sinnvoll ist. Die Lösung besteht darin, anzugeben, bei aws ecr get-loginwelchen Registrierungen Sie sich anmelden möchten.

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

Danach docker pushfunktioniert gut.


das macht Sinn. Aber was solltest du in der passieren --profile? Ich habe ein persönliches Konto, aber ich versuche, auf ein Firmenkonto zu pushen. Mit anderen Worten, wo finde ichprofilename
Ciprian Tomoiagă

1
@ CiprianTomoiagă Sie sollten dies nur einschließen, wenn Sie benannte Profile verwenden. Siehe hier docs.aws.amazon.com/cli/latest/userguide/…
Sergio

5
  1. Stellen Sie sicher, dass Sie zuerst die ECR-Registrierung erstellt haben.
    Schneiden Sie dann gemäß den ECR-Push-Befehlsanweisungen die folgenden Befehle aus und fügen Sie sie ein
  2. Führen Sie den Docker-Anmeldebefehl aus (eval unter Mac / Linux überspringt das Ausschneiden und Einfügen) und
    eval $(aws ecr get-login --region us-east-1)
    fügen Sie --profile hinzu, wenn Sie mehrere AWS-Konten verwenden
    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

Stellen Sie im Fehlerfall sicher, dass Sie alle Befehle erneut ausführen! Die Anmeldeinformationen, die Sie verwenden, aws ecr get-loginsind vorübergehend und verfallen.


Wo finde ich heraus, was ich tun soll your-profile?
Andy

Sie können es weglassen, wenn Sie das Standardprofil verwenden
Jason

Ich habe versucht herauszufinden, wie man das Standardprofil nicht verwendet. Ich habe es jedoch herausgefunden, zusätzliche Profile können in die ~/.aws/configund ~/.aws/credentials-Dateien eingegeben werden.
Andy

5

In meinem Fall habe aws ecr get-login --no-include-email --region *****ich nach dem Ausführen nur die Ausgabe dieses Befehls mit der Form kopiert docker login -u *** -p ************und Sie fügen sie in die Eingabeaufforderung ein. Das Schieben ging voran.



4

In den AWS-Dokumenten werden Sie aufgefordert, den folgenden Befehl auszuführen (für die Region ap-südost-2).

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

Als ich auf dieses Problem stieß, war mir aufgrund dieser Dokumente nicht klar, dass Sie das Ergebnis dieses Befehls in das Terminal eingeben und ausführen müssen.

Das Problem, das bei mir behoben wurde, bestand darin, das Ergebnis mit in die Zwischenablage zu kopieren

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

Fügen Sie das Ergebnis in die Befehlszeile ein und führen Sie es aus


4

Nach dem Ausführen dieses Befehls:

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

Führen Sie einfach den Docker-Anmeldebefehl über die Ausgabe aus

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

ist die Art und Weise, wie sich Docker bei ECR anmelden


3

Dieser Fehler wird im Allgemeinen ausgelöst, wenn die Anmeldung bei ecr fehlgeschlagen ist. Ich verwende das Windows-System und habe im Administratormodus "Powershell" verwendet, um mich zuerst bei ecr anzumelden.

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

Dies sollte "Anmeldung erfolgreich" ausgeben.


Danke! Warum hat das geholfen? Ich habe mich bereits mit saml2aws angemeldet.
Einfluss

2

Ich hatte das gleiche Problem und der Fehler, den ich gemacht habe, war, den falschen Repo-Pfad zu verwenden

z.B: docker push xxxxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/jenkins:latest

Auf dem obigen Pfad habe ich hier den Fehler gemacht: In "dkr.ecr.us-east-1.amazonaws.com"statt "west". Ich habe "verwendet east". Nachdem ich meinen Fehler korrigiert hatte, konnte ich das Bild erfolgreich pushen.


2

Der Docker-Befehl von aws-cli ist wenig falsch ...

Bei Verwendung der Docker-Anmeldung speichert Docker ein Server-Schlüssel-Paar entweder in Ihrem Schlüsselbund oder in der Datei ~ / .docker / config.json

Wenn https://7272727.dkr.ecr.us-east-1.amazonaws.comder Schlüssel während des Push-Vorgangs unter der Suche nach dem Schlüssel gespeichert wird, schlägt dies fehl, da Docker nach einem Server mit dem Namen 7272727.dkr.ecr.us-east-1.amazonaws.comnot sucht https://7272727.dkr.ecr.us-east-1.amazonaws.com.

Verwenden Sie den folgenden Befehl, um sich anzumelden:

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

Sobald Sie den Befehl ausführen, erhalten Sie eine 'Login Succeeded'Nachricht und danach können Sie
Ihren Push-Befehl ausführen


2

Es gibt eine sehr einfache Möglichkeit, Docker-Bilder an ECR zu senden: Amazon ECR Docker Credential Helper . Installieren Sie es einfach gemäß der mitgelieferten Anleitung und aktualisieren Sie es ~/.docker/config.jsonwie folgt:

{
    "credsStore": "ecr-login"
}

und Sie können Ihre Bilder ohne schieben / ziehen docker login.


Ich habe den gleichen Fehler erhalten, nachdem ich den Anweisungen in diesem Artikel gefolgt bin.
Ryechus

1

Ich bin auch auf dieses Problem unter OSX gestoßen. Ich habe die Antwort von Oliver Salzburg gesehen und meine ~ / .docker / config.json überprüft. Es enthielt mehrere Berechtigungsnachweise von den verschiedenen AWS-Konten, die ich habe. Ich habe die Datei gelöscht und nach dem erneuten Ausführen von get-login hat es funktioniert.


1

Stellen Sie sicher, dass Sie die richtige Region verwenden aws ecr get-login. Diese muss mit der Region übereinstimmen, in der Ihr Repository erstellt wurde.


1

Mein Problem bestand darin, mehrere AWS-Anmeldeinformationen zu haben. Standard und dev. Da ich versucht habe, Dev zu implementieren, hat dies funktioniert:

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

1

FWIW, Debian 9, Docker Version 18.06.1-ce, Build e68fc7a:

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


1

Wenn Sie mehrere Profile verwenden und sich bei einem Profil anmelden müssen, das nicht Ihr Standardprofil ist, müssen Sie sich mit folgendem Befehl anmelden:

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

1

Der folgende Befehl funktioniert bei mir:

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

Und dann führe ich diese Befehle aus:

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

Wir sind heute auch auf dieses Problem gestoßen und haben alles versucht, was in diesem Beitrag erwähnt wird (außer das Generieren von AWS-Anmeldeinformationen).

Wir haben das Problem endlich gelöst, indem wir Docker einfach aktualisiert haben, und dann hat der Push funktioniert.

Das Problem wurde mit Docker 1.10.x festgestellt und mit Docker 1.11.x behoben.

Hoffe das hilft


0

Wenn Sie AWS-Konten für CI / CD-Zwecke isolieren und ein ECR-Repository für mehrere AWS-Konten freigeben, müssen Sie das möglicherweise ~/.docker/config.jsonmanuell ändern .

Angenommen, Sie haben diese Einstellungen:

  1. ECR gehört der AWS Account ID 00000000000000
  2. Der CI-Server gehört der AWS-Konto-ID 99999999999999

Wenn Sie aws ecr get-login --region us-west-2 | bashinnerhalb Ihres CI-Servers anrufen , generiert Docker temporäre Anmeldeinformationen in ~/.docker/config.json.

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

Sie möchten jedoch auf das Konto der ECR verweisen, daher müssen Sie den Hostnamen ändern.

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

Beachten Sie, dass diese Situation davon abhängt, wie Sie IAM-Benutzer / -Richtlinien bilden, um den ECR-Zugriff zu ermöglichen.



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

Dieser Befehl gibt mir den richtigen Befehl zum Anmelden. Wenn Sie "--no-include-email" nicht verwenden, wird ein weiterer Fehler ausgegeben. Die Ausgabe des obigen Befehls sieht wie folgt aus: Docker-Login -u AWS -p ************************* sehr groß ******. Kopieren Sie das und führen Sie es aus. Jetzt wird "Login Succeeded" angezeigt. Jetzt können Sie Ihr Bild auf ECR ​​verschieben.

Stellen Sie sicher, dass Ihre AMI-Regel die Berechtigung für den Benutzer hat, für den Sie sich anmelden wollten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.