Impossibile inviare l'immagine ad Amazon ECR - fallisce senza "nessuna credenziale di autenticazione di base"


174

Sto cercando di inviare un'immagine docker a un registro Amazon ECR. Sto usando il client docker Docker versione 1.9.1, build a34a1d5. Uso aws ecr get-login --region us-east-1per ottenere i crediti di accesso alla finestra mobile. Quindi accedo con successo con quei crediti come segue:

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

Ma quando provo a spingere la mia immagine ottengo il seguente errore:

$ 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

Mi sono assicurato che l'utente aws avesse i permessi corretti. Mi sono anche assicurato che il repository consentisse all'utente di spingerlo verso di esso. Solo per essere sicuro che non fosse un problema, ho impostato il registro per consentire a tutti gli utenti l'accesso completo. Nulla cambia l' "no basic auth credentials"errore. Non so come iniziare a eseguire il debug di questo poiché tutto il traffico è crittografato.

AGGIORNARE

Quindi ho avuto un po 'di Homer Simpson D'Oh momento in cui ho capito la causa principale del mio problema. Ho accesso a più account AWS. Anche se stavo usando aws configureper impostare le mie credenziali per l'account in cui avevo impostato il mio repository, aws cli stava effettivamente usando le variabili di ambiente AWS_ACCESS_KEY_IDe AWS_SECRET_ACCESS_KEY. Quindi, quando l'ho fatto aws ecr get-login, stava restituendo un login per l'account sbagliato. Non ho notato che i numeri di conto erano diversi fino a quando non sono appena tornato ora per provare alcune delle risposte proposte. Quando rimuovo le variabili di ambiente, tutto funziona correttamente. Immagino che il motto della storia sia che se colpisci questo errore, assicurati che il repository in cui stai effettuando l'accesso corrisponda al tag che hai applicato all'immagine.


10
Dovresti rendere quell'aggiornamento grassetto, sottolineato e in corsivo. Ho anche avuto quel momento Homer Simpson. Grazie!
Mike,

Grazie per averlo ridotto! Mi hai salvato la giornata letteralmente!
simonso

2
Lo stesso errore viene visualizzato quando il repository non esiste. Controlla se hai creato il repository nell'area corretta.
Ilia Sidorenko,


Nota che puoi configurare il tuo aws cli per gestire più profili utente: docs.aws.amazon.com/cli/latest/userguide/…
Peter Berg,

Risposte:


111

se corri $(aws ecr get-login --region us-east-1)sarà tutto fatto per te


17
Sei una leggenda. La guida di AWS aveva 5 passaggi, tutti con un comando shell tranne il passaggio 2, che diceva solo "Esegui il comando di accesso docker che è stato restituito nel passaggio precedente." Immagino che un mucchio di persone come me si concentri solo sul comando shell e non abbiano letto correttamente le istruzioni
Tien Dinh

Time machine - Perché il wrapping del comando aws in $ () causa il corretto accesso?
VtoCorleone,

6
@VtoCorleone Perché il comando aws stampa semplicemente un comando docker sull'output standard. Se avvolgi quella stringa in $ (), verrà interpretata dalla shell e il docker logincomando verrà eseguito.
Otavio Macedo,

2
$ (aws ecr get-login --region us-west-2) bandiera stenografia sconosciuta: 'e' in -e Vedi 'login docker --help'.
Ashish Karpe,

23
se ricevi "flag di stenografia sconosciuto: 'e'", devi eseguire il comando con il flag --no-include-email in questo modo: $ (aws ecr get-login --region us-east-1 - no-include-email)
Trenton,

57

Nel mio caso si trattava di un bug con Docker per Windows e il loro supporto per Gestione credenziali di Windows.

Apri il tuo ~/.docker/config.jsone rimuovi la "credsStore": "wincred"voce.

Ciò farà sì che le credenziali vengano scritte config.jsondirettamente. Dovrai accedere di nuovo in seguito.

È possibile tenere traccia di questo errore attraverso i biglietti # 22910 e # 24968 su GitHub.


Grazie - ha funzionato su Windows 10. Dopo aver rimosso quella proprietà da config ed aver eseguito nuovamente il comando login docker, il file di configurazione è stato aggiornato con le credenziali e il push ha funzionato.
Cameron,

Non riesco a trovare il file di configurazione. Potete per favore suggerirmi la posizione del file config.json?
Ramashanker Tripathi,

@RamashankerTripathi La posizione è nella risposta. Non sono sicuro di come potrei essere più chiaro.
Der Hochstapler,

@OliverSalzburg Grazie per la risposta. In realtà la mia directory di installazione di Docker non contiene il file config.json.
Ramashanker Tripathi,

@RamashankerTripathi ~/.dockersignifica .dockernella tua home directory. Prova%HOMEDRIVE%%HOMEPATH%\.docker
Der Hochstapler,

50

Se usi i profili, non dimenticare di passare --profile=XXXa aws ecr get-login.


27

Ho avuto anche questo problema. Quello che è successo con me è che ho dimenticato di eseguire il comando che mi è stato restituito dopo l'esecuzione

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

Questo comando ha restituito un grande BLOB, che include il docker logincomando proprio lì! Non me ne sono reso conto. Dovrebbe restituire qualcosa del genere:

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

Copia e incolla questo comando e quindi esegui il comando push finestra mobile che assomiglia a questo:

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

1
Non avevo idea di cosa fosse quella risposta blob, quindi l'ho ignorato. haha. Grazie per averlo segnalato!
duyn9uyen,

15

Questo avrebbe dovuto funzionare anche senza aprire le autorizzazioni. Consulta la documentazione: Autenticazione del registro privato .

[Modifica: in realtà, ho avuto anche problemi con le autorizzazioni quando ho fatto un secondo test. Vedere Docker push nel repository privato ECS AWS non riuscito con JSON non valido ).]

Tuttavia ho avuto lo stesso problema; Non so perché, ma ho usato con successo il meccanismo di autenticazione più prolisso descritto nei documenti per get-autorizzazioni-token

AWS CLI e versioni 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

Ottieni il token di autenticazione ("password docker").

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

Nota: My ~ / .aws / config specifica una regione predefinita diversa, quindi ho dovuto impostare esplicitamente --region us-east-1.

Accedi in modo interattivo ( ############passa al tuo ID account 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>

Invia un'immagine (supponendo che tu abbia creato un'immagine docker 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

Come hai incollato la password molto lunga ??? Il mio è composto da più righe. Sto usando il Terminale di avvio rapido Docker di Windows, che non sembra avere una buona capacità di copia / incolla, o forse non riesco proprio a capirlo.
David,

Per chiunque si chiedesse, dovevo solo contrassegnare e copiare tutto, compreso lo spazio bianco, e poi incollarlo nel Blocco note. Da lì, rimuovo le interruzioni di linea e ricopio tutto, e solo allora posso incollare nella riga di comando del terminale. Ha funzionato
David,

Se stai usando PowerShell, vai su Proprietà> scheda Opzioni e seleziona "Abilita selezione a capo". In questo modo, puoi fare clic e trascinare per selezionare le linee
tratteggiate

Non tocco una macchina Windows da quasi 10 anni, ma potresti sempre reindirizzare stdout a un file: aws ecr get-authorization-token > config.jsone quindi aprirlo nel tuo editor di testo preferito per copiarlo e incollarlo a piacimento
pc

13

Prova con:

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

prima di spingere.


Ho capitono basic auth credentials Invalid IPv6 URL
Thanh Nguyen Van

12

Aggiornare

Dalla versione 2 aws ecr get-logindell'interfaccia della riga di comando di AWS è obsoleto e il metodo corretto è aws ecr get-login-password.

Pertanto la risposta corretta e aggiornata è la seguente: docker login -u AWS -p $(aws ecr get-login-password --region us-east-1) xxxxxxxx.dkr.ecr.us-east-1.amazonaws.com


Ricevounknown flag: --region
kittu

11

Se aiuta qualcuno ...

Il mio problema era che dovevo usare il --profile opzione per autenticarmi con il profilo corretto dal file delle credenziali.

Successivamente, avevo omesso il --region [region_name] comando, che ha anche dato l'errore "no credenziali di autenticazione di base".

La soluzione per me stava cambiando il mio comando da questo:

aws ecr get-login

A questa:

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

Esempio:

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

Spero che aiuti qualcuno!


1
Mi hai salvato! Stavo usando il mio profilo aws in questo modo, AWS_PROFILE=myprofile aws ecr get-logine non ha funzionato ma introdurre il profilo aws con --profileargomento rende il trucco!
Colo Ghidini,

8

Esiste un bug noto nel gestore credenziali con Windows su Windows. La rimozione di "https: //" dal comando di accesso generato risolve questo problema.

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

invece di

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

Vedi anche la pagina di risoluzione dei problemi .


8

Ho riscontrato lo stesso problema.

La generazione di nuove credenziali AWS (chiavi di accesso) e la riconfigurazione della CLI AWS con nuove credenziali hanno risolto il problema.

aws ecr get-login --region us-east-1Comando di login docker generato in precedenza con URL di registro CE non valido.


Lo stesso è successo a me. Grazie!
Greendrake,

Questo era il mio problema Avevo archiviato nelle credenziali ~ / .aws / credenziali CLI AWS diverse da quelle che stavo gestendo. Ricreato nuove credenziali e impostazione che ha funzionato.
Martin Algesten,


5

Ho avuto questo problema con una causa diversa: avevo bisogno di passare a un registro non associato al mio account AWS (registro ECR di un cliente). Il client mi aveva concesso l'accesso nella scheda Autorizzazioni per il registro, aggiungendo il mio ID IAM (ad esempio, arn:aws:iam::{AWS ACCT #}:user/{Username}) come principale. Ho provato ad accedere con i soliti passaggi:

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

Che ovviamente ha portato a no basic auth credentials. A quanto pare , accediaws ecr get-login all'ECR per il registro associato al tuo login , il che ha senso a posteriori. La soluzione è dirloaws ecr get-login quali registri si desidera accedere.

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

Dopodiché, docker pushfunziona perfettamente.


questo ha senso. Ma cosa dovresti passare --profile? Ho un account personale ma sto cercando di passare a un account aziendale. In altre parole, dove trovoprofilename
Ciprian Tomoiagă,

1
@ CiprianTomoiagă dovresti includerlo solo se stai usando i profili con nome. Vedi qui docs.aws.amazon.com/cli/latest/userguide/…
Sergio,

5
  1. Assicurarsi di aver creato prima il registro ECR.
    Quindi, secondo le istruzioni del comando push ECR, taglia e incolla i seguenti comandi
  2. Esegui il comando di accesso alla finestra mobile (eval su Mac / Linux salta il taglia e incolla)
    eval $(aws ecr get-login --region us-east-1)
    aggiungi --profile se usi più account 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

In caso di errore, assicurarsi di eseguire nuovamente tutti i comandi! Le credenziali ottenute aws ecr get-loginsono temporanee e scadranno.


dove posso scoprire cosa mettere your-profile?
Andy,

Puoi lasciarlo fuori se stai usando il profilo predefinito
Jason

Stavo cercando di capire come non usare il profilo predefinito. Ho capito, tuttavia, è possibile inserire profili aggiuntivi nei file ~/.aws/confige ~/.aws/credentials.
Andy,

5

Nel mio caso, dopo l'esecuzione aws ecr get-login --no-include-email --region *****, ho appena copiato l'output di quel comando con il modulo docker login -u *** -p ************e lo si incolla nel prompt. La spinta è andata avanti.


4

I documenti AWS indicano di eseguire il comando seguente (per la regione ap-sud-est-2)

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

Quando mi sono imbattuto in questo problema, non mi era chiaro in base a quei documenti che è necessario inserire il risultato di questo comando nel terminale ed eseguirlo.

La correzione che ha funzionato per me è stata quella di copiare il risultato negli appunti con

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

Incolla il risultato nella riga di comando ed eseguilo


4

Dopo aver eseguito questo comando:

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

basta eseguire il comando login docker dall'output

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

è il modo in cui la finestra mobile accede all'ECR


3

Questo errore viene generalmente generato se l'accesso ecr non è riuscito. Sto usando il sistema Windows e ho usato "Powershell" in modalità amministratore per accedere prima a ecr.

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

Dovrebbe essere visualizzato "Accesso riuscito".


grazie! perché questo ha aiutato? stavo già effettuando l'accesso usando saml2aws.
influente

2

Ho affrontato lo stesso problema e l'errore che ho fatto è stato utilizzare il percorso di repository sbagliato

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

Nel percorso sopra è qui che ho fatto l'errore: In "dkr.ecr.us-east-1.amazonaws.com"invece di "west". Stavo usando " east". Una volta corretto l'errore, sono stato in grado di inviare l'immagine con successo.


2

Il comando docker dato da aws-cli è un po 'fuori ...

Quando si utilizza l'accesso alla finestra mobile, la finestra mobile salverà un server: coppia di chiavi nel proprio portachiavi o nel file ~ / .docker / config.json

Se salva la chiave sotto https://7272727.dkr.ecr.us-east-1.amazonaws.comla ricerca della chiave durante il push fallirà perché la finestra mobile cercherà un server chiamato 7272727.dkr.ecr.us-east-1.amazonaws.comnohttps://7272727.dkr.ecr.us-east-1.amazonaws.com .

Utilizzare il seguente comando per accedere:

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

Una volta eseguito il comando riceverai un 'Login Succeeded'messaggio e poi sarai bravo
dopo che il tuo comando push dovrebbe funzionare


2

Esiste un modo molto semplice per trasferire le immagini docker all'ECR: Amazon ECR Docker Credential Helper . Basta installarlo secondo la guida fornita, aggiornare il proprio ~/.docker/config.jsoncome segue:

{
    "credsStore": "ecr-login"
}

e sarai in grado di spingere / estrarre le tue immagini senza docker login.


Ho avuto lo stesso errore dopo aver seguito le istruzioni in questo articolo.
Ryechus,

1

Mi sono imbattuto in questo problema anche in esecuzione su OSX. Ho visto la risposta di Oliver Salzburg e ho controllato il mio ~ / .docker / config.json. Al suo interno conteneva più credenziali di autorizzazione dai diversi account AWS che ho. Ho eliminato il file e dopo aver eseguito nuovamente get-login ha funzionato.


1

Assicurarsi di utilizzare la regione corretta in aws ecr get-login, deve corrispondere alla regione in cui viene creato il repository.


1

Il mio problema era avere più credenziali AWS; default e dev. Dal momento che stavo cercando di distribuire per sviluppare questo ha funzionato:

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

1

FWIW, Debian 9, Docker versione 18.06.1-ce, build e68fc7a:

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


1

Se si utilizzano più profili e è necessario accedere a un profilo diverso da quello predefinito, è necessario accedere con questo comando:

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

1

Il seguente comando funziona per me:

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

E poi eseguo questi comandi:

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

riscontriamo anche questo problema oggi e abbiamo provato tutto quanto menzionato in questo post (tranne la generazione di credenziali AWS).

Alla fine abbiamo risolto il problema semplicemente aggiornando Docker, quindi la spinta ha funzionato.

Il problema si è verificato con Docker 1.10.x ed è stato risolto con Docker 1.11.x.

Spero che questo ti aiuti


0

Se si isolano gli account AWS per scopi CI / CD e si dispone di un repository ECR condiviso tra più account AWS, potrebbe essere necessario modificare ~/.docker/config.jsonmanualmente.

Supponiamo che tu abbia queste impostazioni:

  1. ECR è di proprietà dell'ID account AWS 00000000000000
  2. Il server CI è di proprietà dell'ID account AWS 99999999999999

Se si chiama aws ecr get-login --region us-west-2 | bashall'interno del proprio server CI, la finestra mobile genererà credenziali temporanee in ~/.docker/config.json.

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

Ma vuoi puntare all'account ECR, quindi devi cambiare il nome host.

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

Si noti che questa situazione dipende dal modo in cui si forma l'utente / politica IAM per consentire l'accesso ECR.



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

Questo comando mi dà il comando corretto per accedere. Se non usi "--no-include-email", verrà generato un altro errore. L'output del comando sopra appare come questo docker login -u AWS -p ********************** molto grande ******. Copialo ed eseguilo. Ora mostrerà "Login riuscito". Ora puoi spingere la tua immagine in ECR.

Assicurarsi che la regola AMI disponga dell'autorizzazione per l'utente a cui si è tentato di accedere.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.