画像をAmazon ECRにプッシュできません-「基本認証資格情報がありません」で失敗する


172

DockerイメージをAmazon ECRレジストリにプッシュしようとしています。私はDockerクライアントDockerバージョン1.9.1を使用してビルドしていa34a1d5ます。私aws ecr get-login --region us-east-1はdocker login credsを取得するために使用しています。次に、これらの資格情報を使用して次のように正常にログインします。

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
リポジトリが存在しない場合も同じエラーが発生します。正しいリージョンにリポジトリを作成したかどうかを確認します。
Ilia Sidorenko 2016


複数のユーザープロファイルを処理するようにaws cliを設定できることに注意してください。 docs.aws.amazon.com/cli/latest/userguide/...
ピーター・バーグ

回答:


110

実行すれば$(aws ecr get-login --region us-east-1)すべて完了です


17
あなたは伝説です。AWSガイドには、「前のステップで返されたdocker loginコマンドを実行する」というステップ2を除いて、シェルコマンドを含む5つのステップがあります。私のような人々の全体のヒープは、シェルコマンドに集中し、命令を適切に読み取らなかったと思います
Tien Dinh

タイムマシン-awsコマンドを$()でラップすると、ログインが正しく成功するのはなぜですか?
VtoCorleone 2017

6
@VtoCorleone awsコマンドはdockerコマンドを標準出力に出力するだけだからです。その文字列を$()でラップすると、シェルによって解釈され、docker loginコマンドが実行されます。
Otavio Macedo 2017

2
$(aws ecr get-login --region us-west-2)不明な省略形フラグ: 'e' in -e 'docker login --help'を参照してください。
Ashish Karpe 2017

23
「不明な略記フラグ: 'e'」を取得している場合は、次のように--no-include-emailフラグを指定してコマンドを実行する必要があります。$(aws ecr get-login --region us-east-1- no-include-email)
トレントン

57

私の場合、これはDocker for WindowsとWindows Credential Managerに対するサポートのバグでした。

を開き~/.docker/config.json"credsStore": "wincred"エントリを削除します。

これにより、資格情報がconfig.json直接書き込まれます。その後、再度ログインする必要があります。

このバグは、GitHubのチケット#22910および#24968で追跡できます。


おかげで-Windows 10で動作しました。構成からそのプロパティを削除し、docker loginコマンドを再度実行すると、構成ファイルが資格情報で更新され、プッシュが機能しました。
Cameron

設定ファイルが見つかりません。config.jsonファイルの場所を教えてください。
Ramashanker Tripathi

@RamashankerTripathi場所は答えです。どうすればもっと明確にできるかわかりません。
Der Hochstapler

@OliverSalzburg返信ありがとうございます。実際、私のDockerインストールディレクトリにはconfig.jsonファイルが含まれていません。
Ramashanker Tripathi

@RamashankerTripathi ~/.docker.docker、ホームディレクトリを意味します。試してみる%HOMEDRIVE%%HOMEPATH%\.docker
Der Hochstapler

50

プロファイルを使用する場合は、に渡す--profile=XXXことを忘れないでくださいaws ecr get-login


27

私にもこの問題がありました。私に起こったことは、実行後に返されたコマンドを実行するのを忘れていた

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

このコマンドは大きなblobを返しましたが、そこにはそのdocker loginコマンドが含まれています!気づかなかった。次のようなものが返されます。

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

このコマンドをコピーして貼り付け、次のようなdocker pushコマンドを実行します。

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

1
そのblob応答が何であるかがわからなかったので、無視しました。はは。これを指摘してくれてありがとう!
duyn9uyen 2018

14

これは、権限を開かなくても機能するはずです。ドキュメント:Private Registry Authenticationを参照してください。

[編集:実際には、2番目のテストを実行するときに、権限の問題も発生しました。不正な形式のJSONで失敗するDocker push to AWS ECR private repoを参照してください)]

それにもかかわらず、私は同じ問題を抱えていました。理由はわかりませんが、get-authorization-tokenのドキュメントで説明されている、より時間のかかる認証メカニズムを正常に使用しました

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

認証トークン(「dockerパスワード」)を取得します。

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アカウント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>

画像をプッシュします(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

非常に長いパスワードをどのように貼り付けましたか??? 鉱山は数行あります。私はWindows Dockerクイックスタートターミナルを使用していますが、これには適切なコピー/貼り付け機能がないようです。あるいは、それを理解できないだけかもしれません。
David

疑問に思っている人なら誰でも、空白を含むすべてをマークアンドコピーして、それをメモ帳に貼り付ける必要がありました。そこから、改行を削除してすべてを再コピーします。その後、ターミナルコマンドラインに貼り付けることができます。うまくいきました。
David

PowerShellを使用している場合は、[プロパティ]> [オプション]タブに移動し、[行の折り返しの選択を有効にする]を選択します。そうすれば、あなたは手動など新しい行を削除、メモ帳にコピーすることなく、ラップラインを選択する]をクリックしてドラッグすることができます
adarshr

私はほとんど10年でWindowsマシンに触れていないが、あなたは常にパイプstdoutがファイルにできますaws ecr get-authorization-token > config.jsonし、コピーして自由に貼り付けるためにあなたの好みのテキストエディタで開き
pcting

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


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いましたが、うまくいきませんでしたが、--profile引数付きのawsプロファイルを導入するとうまくいきます!
Colo Ghidini、2018年


8

同じ問題が発生しました。

新しいAWS認証情報(アクセスキー)を生成し、新しい認証情報でAWS CLIを再構成すると、問題が解決しました。

以前は、aws ecr get-login --region us-east-1無効なECレジストリURL で生成されたdocker loginコマンド。


同じことが私にも起こりました。ありがとう!
Greendrake 2016

これが私の問題でした。私が管理していたawsとは異なるAWS CLI認証情報を〜/ .aws / credentialsに保存しました。機能した新しい資格情報と設定を再作成しました。
Martin Algesten、2016年

5

この問題には別の原因がありました。AWSアカウントに関連付けられていないレジストリ(クライアントのECRレジストリ)にプッシュする必要がありました。クライアントは、IAM ID(例:)を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
CiprianTomoiagă19年

1
@CiprianTomoiagă名前付きプロファイルを使用している場合のみ、それを含める必要があります。ここdocs.aws.amazon.com/cli/latest/userguide/…を
セルジオ

5
  1. 最初にECRレジストリを作成したことを確認してください。
    次に、ECRプッシュコマンドの指示に従って、次のコマンドをカットアンドペーストします

  2. eval $(aws ecr get-login --region us-east-1)
    複数のAWSアカウントを使用している場合は、docker loginコマンドを実行します(Mac / Linuxのevalはカットアンドペーストをスキップします)add --profileを追加します
    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か?
アンディ

デフォルトのプロファイルを使用している場合は省略できます
Jason

デフォルトのプロファイルを使用しない方法を見つけようとしていました。しかし、私はそれを理解しました、~/.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コマンドを実行するだけです

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

dockerがECRにログインする方法です


3

このエラーは通常、ecrログインが失敗した場合にスローされます。私はWindowsシステムを使用していて、最初にecrにログインするために管理者モードで「Powershell」を使用しました。

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コマンドは少しずれています...

docker loginを使用すると、dockerはserver:keyペアをキーチェーンまたは〜/ .docker / config.jsonファイルに保存します

https://7272727.dkr.ecr.us-east-1.amazonaws.comDockerが7272727.dkr.ecr.us-east-1.amazonaws.comnot という名前のサーバーを探しているため、プッシュ中にキーの検索でキーを保存すると、失敗します。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'メッセージが表示され、その後
、プッシュコマンドが機能するようになります。


2

DockerイメージをECRにプッシュする非常に簡単な方法として、Amazon ECR Docker Credential Helperがあります。提供されているガイドに従ってインストール~/.docker/config.jsonし、次のように更新します。

{
    "credsStore": "ecr-login"
}

なしで画像をプッシュ/プルできますdocker login


この記事の手順に従っても同じエラーが発生しました。
ryechus

1

私はこの問題に遭遇し、OSXでも実行されていました。Oliver Salzburgの応答を見て、〜/ .docker / config.jsonを確認しました。私が持っているさまざまなAWSアカウントからの内部に複数の認証資格情報がありました。私はファイルを削除し、再びget-loginを実行した後、それは機能しました。


1

で正しいリージョンを使用していることを確認aws ecr get-loginしてください。リポジトリが作成されているリージョンと一致している必要があります。


1

私の問題は複数のAWS認証情報を持っていることでした。デフォルトと開発。私は開発にデプロイしようとしていたので、これはうまくいきました:

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

1

FWIW、Debian 9、Dockerバージョン18.06.1-ce、ビルドe68fc7a:

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


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をアップグレードするだけで問題が解決し、プッシュが機能しました。

この問題はDocker 1.10.xで発生し、Docker 1.11.xで解決されました。

お役に立てれば


0

CI / CDの目的でAWSアカウントを分離し、1つのECRリポジトリを複数のAWSアカウントで共有している場合は、~/.docker/config.json手動で変更する必要がある場合があります。

次の設定があるとします。

  1. ECRはAWSアカウントIDが所有しています 00000000000000
  2. CIサーバーはAWSアカウントIDによって所有されています 99999999999999

aws ecr get-login --region us-west-2 | bashCIサーバー内で呼び出すと、Dockerは一時的な認証情報をで生成し~/.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」を使用しないと、別のエラーがスローされます。上記のコマンドの出力は、このdocker login -u AWS -p ********************** very big ******のようになります。それをコピーして実行します。「ログインに成功しました」と表示されます。これで、イメージをECRにプッシュできます。

AMIルールに、ログインしようとしたユーザーの権限があることを確認してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.