Impossible de pousser l'image vers Amazon ECR - échoue sans "aucune information d'authentification de base"

174

J'essaie de pousser une image docker dans un registre Amazon ECR. J'utilise le client docker Docker version 1.9.1, build a34a1d5. J'utilise aws ecr get-login --region us-east-1pour obtenir les crédits de connexion docker. Ensuite, je me connecte avec succès avec ces crédits comme suit:

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

Mais lorsque j'essaye de pousser mon image, j'obtiens l'erreur suivante:

$ 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

Je me suis assuré que l'utilisateur aws avait les autorisations appropriées. Je me suis également assuré que le référentiel permettait à cet utilisateur d'y accéder. Juste pour m'assurer que ce n'était pas un problème, j'ai configuré le registre pour permettre à tous les utilisateurs un accès complet. Rien ne change l' "no basic auth credentials"erreur. Je ne sais pas comment commencer à déboguer cela car tout le trafic est crypté.

METTRE À JOUR

J'ai donc eu un peu d'Homer Simpson D'Oh au moment où j'ai réalisé la cause profonde de mon problème. J'ai accès à plusieurs comptes AWS. Même si j'utilisais aws configurepour définir mes informations d'identification pour le compte sur lequel j'avais configuré mon référentiel, aws cli utilisait en fait les variables d'environnement AWS_ACCESS_KEY_IDet AWS_SECRET_ACCESS_KEY. Donc, quand je l'ai fait, aws ecr get-logincela retournait un identifiant pour le mauvais compte. Je n'ai pas remarqué que les numéros de compte étaient différents jusqu'à ce que je revienne maintenant pour essayer certaines des réponses proposées. Lorsque je supprime les variables d'environnement, tout fonctionne correctement. Je suppose que la devise de l'histoire est que si vous rencontrez cette erreur, assurez-vous que le référentiel auquel vous vous connectez correspond à la balise que vous avez appliquée à l'image.

Alec Rooney
la source
10
Vous devez rendre cette mise à jour en gras, soulignée et en italique. Je viens aussi d'avoir ce moment Homer Simpson. Je vous remercie!
Mike
Merci de le préciser! Vous m'avez sauvé la journée littéralement!
simonso
2
La même erreur est donnée lorsque le référentiel n'existe pas. Vérifiez si vous avez créé le dépôt dans la bonne région.
Ilia Sidorenko
Notez que vous pouvez configurer votre aws cli pour gérer plusieurs profils utilisateur: docs.aws.amazon.com/cli/latest/userguide / ...
Peter Berg

Réponses:

111

si tu cours $(aws ecr get-login --region us-east-1) tout sera fait pour vous

Antonio Terreno
la source
17
Tu es une légende. Le guide AWS comportait 5 étapes, toutes avec une commande shell à l'exception de l'étape 2, qui dit uniquement «Exécutez la commande de connexion docker qui a été renvoyée à l'étape précédente». Je suppose que tout un tas de gens comme moi se concentrent simplement sur la commande shell et n'ont pas lu les instructions correctement
Tien Dinh
Machine à remonter le temps - Pourquoi l'encapsulation de la commande aws dans $ () entraîne-t-elle la réussite de la connexion?
VtoCorleone
6
@VtoCorleone Parce que la commande aws imprime simplement une commande docker sur la sortie standard. Si vous encapsulez cette chaîne dans $ (), elle sera interprétée par le shell et la docker logincommande sera exécutée.
Otavio Macedo
2
$ (aws ecr get-login --region us-west-2) indicateur de raccourci inconnu: 'e' in -e Voir 'docker login --help'.
Ashish Karpe
23
si vous obtenez un "drapeau de raccourci inconnu: 'e'", vous devez exécuter la commande avec le drapeau --no-include-email comme ceci: $ (aws ecr get-login --region us-east-1 - no-include-email)
Trenton
57

Dans mon cas, il s'agissait d'un bogue avec Docker pour Windows et leur prise en charge de Windows Credential Manager.

Ouvrez votre ~/.docker/config.jsonet supprimez l' "credsStore": "wincred"entrée.

Cela entraînera l'écriture des informations d'identification config.jsondirectement dans le. Vous devrez ensuite vous reconnecter.

Vous pouvez suivre ce bug via les tickets # 22910 et # 24968 sur GitHub.

Der Hochstapler
la source
Merci - a travaillé sur Windows 10. Après avoir supprimé cette propriété de la configuration et exécuté à nouveau la commande de connexion docker, le fichier de configuration a été mis à jour avec les informations d'identification, et le push a fonctionné.
Cameron
Je ne parviens pas à trouver le fichier de configuration. Pouvez-vous me suggérer l'emplacement du fichier config.json?
Ramashanker Tripathi
@RamashankerTripathi L'emplacement est dans la réponse. Je ne sais pas comment je pourrais être plus clair.
Der Hochstapler
@OliverSalzburg Merci pour la réponse. En fait, mon répertoire d'installation Docker ne contient pas de fichier config.json.
Ramashanker Tripathi
@RamashankerTripathi ~/.dockersignifie .dockerdans votre répertoire personnel. Essayer%HOMEDRIVE%%HOMEPATH%\.docker
Der Hochstapler
50

Si vous utilisez des profils, n'oubliez pas de passer --profile=XXXà aws ecr get-login.

Greg
la source
27

J'ai eu ce problème aussi. Ce qui m'est arrivé, c'est que j'ai oublié d'exécuter la commande qui m'a été renvoyée après avoir couru

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

Cette commande a renvoyé un gros blob, qui inclut la docker logincommande juste là! Je n'ai pas réalisé. Il devrait renvoyer quelque chose comme ceci:

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

Copiez et collez cette commande, puis exécutez votre commande push docker qui ressemble à ceci:

docker push 8888888.blah.blah.ap-southwest-1.amazonaws.com/dockerfilename
James111
la source
1
Je n'avais aucune idée de ce qu'était cette réponse blob, alors je l'ai ignorée. haha. Merci de l'avoir signalé!
duyn9uyen
15

Cela aurait dû fonctionner même sans ouvrir les autorisations. Voir la documentation: Authentification du registre privé .

[Edit: en fait, j'ai aussi eu des problèmes d'autorisations lors d'un deuxième test. Consultez Docker push to AWS ECR private repo failing with malformed JSON ).]

Néanmoins j'ai eu le même problème; Je ne sais pas pourquoi, mais j'ai utilisé avec succès le mécanisme d'authentification plus long décrit dans la documentation pour obtenir-autorisation-jeton

Versions de l'AWS CLI et de 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

Obtenez le jeton d'authentification ('docker password').

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

Remarque: Mon ~ / .aws / config spécifie une région par défaut différente, j'ai donc dû définir explicitement --region us-east-1.

Connectez-vous de manière interactive (modifiez ############votre identifiant de compte 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>

Poussez une image (en supposant que vous ayez créé une image 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
fazy
la source
Comment avez-vous collé le très long mot de passe ??? Le mien est de plusieurs lignes. J'utilise le terminal de démarrage rapide de Windows Docker, qui ne semble pas avoir une bonne capacité de copier / coller, ou peut-être que je ne peux tout simplement pas le comprendre.
David
Pour quiconque se demande, je devais juste marquer et copier le tout, y compris les espaces blancs, puis le coller dans le Bloc-notes. A partir de là, je supprimer les sauts de ligne, et tout recopie, et seulement alors je peux coller dans la ligne de commande terminal. Ça a marché.
David
Si vous utilisez PowerShell, accédez à l'onglet Propriétés> Options et sélectionnez «Activer la sélection d'habillage de ligne». De cette façon, vous pouvez cliquer et faire glisser pour sélectionner les lignes enveloppées sans avoir à les copier manuellement dans le Bloc-notes, supprimer de nouvelles lignes, etc.
adarshr
Je ne l' ai pas touché une machine Windows dans près de 10 ans, mais vous pouvez toujours stdout de pipe dans un fichier: aws ecr get-authorization-token > config.jsonpuis l' ouvrir dans votre éditeur de texte favori pour copier et coller à volonté
pcting
13

Essayez avec:

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

avant de pousser.

MrMins
la source
J'ai çano basic auth credentials Invalid IPv6 URL
Thanh Nguyen Van
13

Mettre à jour

Depuis AWS CLI version 2 - aws ecr get-loginest obsolète et la méthode correcte estaws ecr get-login-password .

Par conséquent, la réponse correcte et mise à jour est la suivante: docker login -u AWS -p $(aws ecr get-login-password --region us-east-1) xxxxxxxx.dkr.ecr.us-east-1.amazonaws.com

Omry Zobel
la source
Je reçoisunknown flag: --region
kittu
11

Si cela aide quelqu'un ...

Mon problème était que je devais utiliser l' --profileoption afin de m'authentifier avec le profil approprié du fichier d'informations d'identification.

Ensuite, j'avais omis la --region [region_name]commande, qui a également donné l'erreur "pas d'informations d'identification d'authentification de base".

La solution pour moi était de changer ma commande à partir de ceci:

aws ecr get-login

Pour ça:

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

Exemple:

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

J'espère que cela aide quelqu'un!

Lansana Camara
la source
1
Tu m'as sauvé! J'utilisais mon profil aws comme celui-ci, AWS_PROFILE=myprofile aws ecr get-loginet cela n'a pas fonctionné, mais l'introduction du profil aws avec --profileargument fait l'affaire!
Colo Ghidini
8

Il existe un bogue connu dans le gestionnaire d'informations d'identification wincred sous Windows. La suppression de «https: //» de la commande de connexion générée résout ce problème.

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

au lieu de

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

Voir également la page de dépannage .

Tom Rijntjes
la source
8

J'ai rencontré le même problème.

La génération de nouvelles informations d'identification AWS (clés d'accès) et la reconfiguration de l'AWS CLI avec de nouvelles informations d'identification ont résolu le problème.

Plus tôt, aws ecr get-login --region us-east-1généré commande de connexion docker avec l' URL de Registre non valide CE.

temasso
la source
La même chose m'est arrivée. Merci!
Greendrake
C'était mon problème. J'avais des informations d'identification AWS CLI différentes stockées dans le ~ / .aws / informations d'identification que les aws que je gérais. Recréation de nouvelles informations d'identification et paramètres qui ont fonctionné.
Martin Algesten
6

Sous Windows dans PowerShell , utilisez:

Invoke-Expression $(aws ecr get-login --no-include-email)
Igor Akkerman
la source
c'est toujours d'actualité
Chappie Johnson
5

J'ai eu ce problème avec une cause différente: je devais pousser vers un registre non associé à mon compte AWS (registre ECR d'un client). Le client m'avait accordé l'accès sous l'onglet Autorisations du registre, en ajoutant mon identifiant IAM (par exemple arn:aws:iam::{AWS ACCT #}:user/{Username}) en tant que principal. J'ai essayé de me connecter avec les étapes habituelles:

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

Ce qui a bien sûr abouti no basic auth credentials. En fin de compte , aws ecr get-loginvous vous connectez à l'ECR pour le registre associé à votre connexion , ce qui a du sens rétrospectivement. La solution consiste à indiquer à aws ecr get-loginquel (s) registre (s) vous souhaitez vous connecter.

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

Après cela, docker pushfonctionne très bien.

Jason Clark
la source
c'est logique. Mais que devez-vous passer dans le --profile? J'ai un compte personnel mais j'essaie de pousser vers un compte d'entreprise. En d'autres termes, où puis-je trouverprofilename
Ciprian Tomoiagă
1
@ CiprianTomoiagă vous ne devriez inclure cela que si vous utilisez des profils nommés. Voir ici docs.aws.amazon.com/cli/latest/userguide/…
Sergio
5
  1. Assurez-vous d'avoir d'abord créé le registre ECR.
    Ensuite, selon les instructions de commande push ECR, coupez et collez les commandes suivantes
  2. Exécutez la commande de connexion docker (eval sur Mac / Linux ignore le copier-coller)
    eval $(aws ecr get-login --region us-east-1)
    add --profile si vous utilisez plusieurs comptes 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

En cas d'erreur, assurez-vous d'exécuter à nouveau toutes les commandes! Les informations d'identification que vous utilisez aws ecr get-loginsont temporaires et expireront.

Jason
la source
où puis-je savoir quoi mettre your-profile?
Andy
Vous pouvez le laisser de côté si vous utilisez le profil par défaut
Jason
J'essayais de comprendre comment ne pas utiliser le profil par défaut. J'ai compris que des profils supplémentaires peuvent être saisis dans les fichiers ~/.aws/configet ~/.aws/credentials.
Andy
5

Dans mon cas, après l'exécution aws ecr get-login --no-include-email --region *****, je viens de copier la sortie de cette commande avec est de la forme docker login -u *** -p ************, et vous la collez dans l'invite. La poussée a continué.

Julien Nyambal
la source
4

Les documents AWS vous indiquent d'exécuter la commande suivante (pour la région ap-sud-est-2)

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

Lorsque je suis tombé sur ce problème, il n'était pas clair pour moi sur la base de cette documentation que vous deviez entrer le résultat de cette commande dans le terminal et l'exécuter.

Le correctif qui a fonctionné pour moi était de copier le résultat dans le presse-papiers avec

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

Collez le résultat dans la ligne de commande et exécutez-le

Dan Groch
la source
4

Après avoir exécuté cette commande:

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

exécutez simplement la commande de connexion docker à partir de la sortie

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

est la façon dont docker se connecte à ECR

Javier Rodriguez
la source
3

Cette erreur est généralement générée si la connexion ecr a échoué. J'utilise le système Windows et j'ai utilisé "Powershell" en mode Administrateur pour me connecter d'abord à ecr.

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

Cela devrait afficher "Connexion réussie".

Kumarras
la source
Merci! pourquoi cela a-t-il aidé? je me connectais déjà en utilisant saml2aws.
influent
2

J'ai rencontré le même problème et l'erreur que j'ai commise était d'utiliser le mauvais chemin de dépôt

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

Dans le chemin ci-dessus, c'est là que j'ai commis l'erreur: In "dkr.ecr.us-east-1.amazonaws.com"au lieu de "west". J'utilisais " east". Une fois que j'ai corrigé mon erreur, j'ai pu pousser l'image avec succès.

karthik vee
la source
2

La commande docker donnée par aws-cli est peu décalée ...

Lorsque vous utilisez la connexion docker, docker enregistre un serveur: paire de clés dans votre trousseau ou dans le fichier ~ / .docker / config.json

S'il enregistre la clé sous https://7272727.dkr.ecr.us-east-1.amazonaws.comla recherche de la clé pendant la transmission échouera car docker recherchera un serveur nommé 7272727.dkr.ecr.us-east-1.amazonaws.comnot https://7272727.dkr.ecr.us-east-1.amazonaws.com.

Utilisez la commande suivante pour vous connecter:

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

Une fois que vous exécutez la commande, vous recevrez un 'Login Succeeded'message et vous êtes bon
après cela, votre commande push devrait fonctionner

Dakshin Radjavel
la source
2

Il existe un moyen très simple de pousser des images docker vers ECR: Amazon ECR Docker Credential Helper . Installez-le simplement selon le guide fourni, mettez à jour votre ~/.docker/config.jsoncomme suit:

{
    "credsStore": "ecr-login"
}

et vous pourrez pousser / tirer vos images sans docker login.

Cepr0
la source
J'ai eu la même erreur après avoir suivi les instructions de cet article.
ryechus le
1

J'ai rencontré ce problème également sous OSX. J'ai vu la réponse d'Oliver Salzburg et j'ai vérifié mon ~ / .docker / config.json. Il contenait plusieurs informations d'identification d'autorisation provenant des différents comptes AWS dont je dispose. J'ai supprimé le fichier et après avoir exécuté à nouveau get-login, cela a fonctionné.

Minh Tran
la source
1

Assurez-vous d'utiliser la bonne région dans aws ecr get-login, elle doit correspondre à la région dans laquelle votre référentiel est créé.

Lech Migdal
la source
1

Mon problème était d'avoir plusieurs informations d'identification AWS; default et dev. Depuis que j'essayais de déployer vers le développement, cela a fonctionné:

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

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

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

Ligemer
la source
1

Si vous utilisez plusieurs profils et que vous devez vous connecter à un profil qui n'est pas votre profil par défaut, vous devez vous connecter avec cette commande:

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

La commande suivante fonctionne pour moi:

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

Et puis j'exécute ces commandes:

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
la source
0

nous rencontrons également ce problème aujourd'hui et avons essayé tout ce qui est mentionné dans cet article (sauf la génération des informations d'identification AWS).

Nous avons finalement résolu le problème en mettant simplement à jour Docker, puis le push a fonctionné.

Le problème a été rencontré avec Docker 1.10.x et a été résolu avec Docker 1.11.x.

J'espère que cela t'aides

Baptiste Gaillard
la source
0

Si vous isolez des comptes AWS à des fins de CI / CD et que vous avez un référentiel ECR partagé entre plusieurs comptes AWS, vous devrez peut-être modifier le ~/.docker/config.json manuellement.

Disons que vous avez ces configurations:

  1. ECR appartient à l'ID de compte AWS 00000000000000
  2. Le serveur CI appartient à l'ID de compte AWS 99999999999999

Si vous appelez aws ecr get-login --region us-west-2 | bashdans votre serveur CI, docker générera des informations d'identification temporaires dans ~/.docker/config.json.

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

Mais vous voulez pointer vers le compte de l'ECR, vous devez donc changer le nom d'hôte.

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

Notez que cette situation dépend de la manière dont vous créez un utilisateur / une stratégie IAM pour autoriser l'accès ECR.

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

Cette commande me donne une commande correcte pour me connecter. Si vous n'utilisez pas "--no-include-email", une autre erreur sera générée. La sortie de la commande ci-dessus ressemble à cette connexion docker -u AWS -p ********************** très gros ******. Copiez-le et exécutez-le. Maintenant, il affichera "Connexion réussie". Vous pouvez maintenant pousser votre image vers ECR.

Assurez-vous que votre règle AMI dispose de l'autorisation pour l'utilisateur auquel vous avez tenté de vous connecter.

Omar Faroque Anik
la source