Amazon ECRにイメージをプッシュできません - 「基本認証認証情報がありません」というメッセージが表示されて失敗する
DockerイメージをAmazon ECRレジストリにプッシュしようとしています。私はDockerクライアントDockerバージョン1.9.1、ビルドa34a1d5を使用しています。 dockerのログインクレジットを取得するには、 "aws ecr get-login --region us-east-1"を使用します。それから私は以下のようにそれらの信用でうまくログインしました:
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ユーザーが正しい許可を持っていることを確認しました。私はまた、リポジトリがそのユーザーにプッシュを許可していることを確認しました。これが問題にならないようにするために、すべてのユーザーにフルアクセスを許可するようにレジストリを設定しました。 「基本認証資格情報がない」というエラーが変更されることはありません。トラフィックはすべて暗号化されているため、これをデバッグする方法がわかりません。
UPDATE
だから私は私の問題の根本的な原因を理解したときに少しホーマーシンプソンD'Ohの瞬間がありました。複数のAWSアカウントにアクセスできます。 aws configureを使用して自分のリポジトリを設定したアカウントの認証情報を設定しましたが、aws cliは実際には環境変数AWS_ACCESS_KEY_IDおよびAWS_SECRET_ACCESS_KEYを使用していました。そのため、aws ecr get-loginを実行したときに、間違ったアカウントのログインを返していました。提案された答えのいくつかを試すために今すぐ戻るまで、アカウント番号が異なることに気付きませんでした。環境変数を削除すると、すべて正常に動作します。ストーリーのモットーは、このエラーが発生した場合は、ログインしているリポジトリが画像に適用したタグと一致していることを確認することです。
$(aws ecr get-login --region us-east-1)
を実行すれば、すべて完了です。
プロファイルを使用する場合は、--profile=XXX
をaws ecr get-login
に渡すことを忘れないでください。
私もこの問題を抱えていました。私と一緒に起こったことは私が走った後私に返されたコマンドを実行するのを忘れていた
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
これはパーミッションを開かなくてもうまくいったはずです。ドキュメントを参照してください。 Private Registry Authentication 。
[編集:実際には、私は2回目のテストをするときも私はパーミッションの問題を抱えていた。 DockerからAWS ECRへのプライベートレポジトリが不正なJSONで失敗する )を参照してください。
それにもかかわらず、私は同じ問題を抱えていました。理由はわかりませんが、 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 password')を取得してください。
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
試してみてください。
eval $(aws ecr get-login --no-include-email | sed 's|https://||')
押す前に。
それが誰にでも役立つなら...
私の問題は、資格情報ファイルから適切なプロファイルで認証するために--profile
オプションを使用しなければならなかったことです。
次に、--region [region_name]
コマンドを省略しました。これにより、 "no basic auth credentials"エラーも表示されます。
私のための解決策はこれから私のコマンドを変更することでした:
aws ecr get-login
これに:
aws --profile [profile_name] ecr get-login --region [region_name]
例:
aws --profile foo ecr get-login --region us-east-1
誰かに役立つことを願っています!
Windowsのwincred credential managerに既知のバグがあります。生成されたloginコマンドから「https://」を削除すると、これが解決します。
docker login -u AWS -p <password> <aws_account_id>.dkr.ecr.<region>.amazonaws.com
の代わりに
docker login -u AWS -p <password> https://<aws_account_id>.dkr.ecr.<region>.amazonaws.com
トラブルシューティングページ もご覧ください。
私は同じ問題を経験しました。
新しいAWS認証情報(アクセスキー)を生成し、新しい認証情報でAWS CLIを再設定することで問題を解決しました。
以前のaws ecr get-login --region us-east-1
は、無効なECレジストリURLを含むdocker loginコマンドを生成しました。
私の場合は、aws ecr get-login --no-include-email --region *****
を実行した後、そのコマンドの出力をdocker login -u *** -p ************
の形式でコピーし、プロンプトに貼り付けました。推進は先に行きました。
- 最初にECRレジストリを作成したことを確認してください。
次に、ECRプッシュコマンドの説明に従って、次のコマンドをカットアンドペーストします。 - Docker loginコマンドを実行します(Mac/Linuxではevalはカットアンドペーストをスキップします)。
eval $(aws ecr get-login --region us-east-1)
複数のAWSアカウントを使用している場合は--profileを追加してくださいeval $(aws ecr get-login --region us-east-1 --profile your-profile)
docker build -t image-name .
docker tag image-name:latest ############.dkr.ecr.us-east-1.amazonaws.com/image-name:latest
docker Push ############.dkr.ecr.us-east-1.amazonaws.com/image-name:latest
エラーが発生した場合は、すべてのコマンドをもう一度実行してくださいaws ecr get-login
を使用して取得した認証情報は一時的なものであり、期限が切れます。
AWSドキュメントには、次のコマンドを実行するように指示されています(ap-southeast-2 regionの場合)
aws ecr get-login --region ap-southeast-2
この問題にぶつかったとき、そのドキュメントに基づいて、このコマンドの結果を端末に入力して実行する必要があることは明らかではありませんでした。
私のために働いた修正はでクリップボードに結果をコピーすることでした
aws ecr get-login --region ap-southeast-2 | pbcopy
結果をコマンドラインに貼り付けて実行します
私はこの問題を別の原因で抱えていました。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
は問題なく動作します。
このコマンドを実行した後:
(aws ecr get-login --no-include-email --region us-west-2)
出力からdocker loginコマンドを実行するだけです。
docker login -u AWS -p epJ....
dockerがECRにログインする方法です。
私はこの問題に遭遇し、OSX上でも同様に実行しました。 Oliver Salzburgの応答を見て、私の〜/ .docker/config.jsonをチェックしました。それは私が持っている異なるAWSアカウントからの内部に複数の認証認証情報を持っていました。私はファイルを削除しました、そして再びget-loginを実行した後それはうまくいきました。
私の問題は複数のAWS認証情報を持つことでした。デフォルトおよび開発者。私はdevにデプロイしようとしていたのでこれはうまくいきました:
$(aws ecr get-login --no-include-email --region eu-west-1 --profile dev | sed 's|https://||')
Windows in PowerShellの場合は、次のように入力します。
Invoke-Expression $(aws ecr get-login --no-include-email)
私は同じ問題に直面し、私がした間違いは間違ったリポジトリパスを使用していたことです
例:docker Push xxxxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/jenkins:latest
上記のパスでこれが私がミスをしたところです:"dkr.ecr.us-east-1.amazonaws.com"
の代わりに"west"
。私は "east"
を使用していました。私の間違いを直すと、画像をプッシュすることができました。
Aws-cliによって提供されたdockerコマンドは、ちょっとオフです...
Dockerログインを使用する場合、dockerはserver:というキーペアまたは〜/ .docker/config.jsonファイルのいずれかにserver:キーペアを保存します。
それがhttps://7272727.dkr.ecr.us-east-1.amazonaws.com
の下にキーを保存すると、dockerは7272727.dkr.ecr.us-east-1.amazonaws.com
ではなく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'
メッセージが表示されますので、問題ありません。
その後、Pushコマンドは機能するはずです
FWIW、Debian 9、Dockerバージョン18.06.1-ce、ビルドe68fc7a:
$(aws ecr get-login | sed 's| -e none | |g')
次のコマンドは私のために働きます:
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
複数のプロファイルを使用していて、デフォルトのプロファイルではないプロファイルにログインする必要がある場合は、次のコマンドでログインする必要があります。
$(AWS_PROFILE=<YOUR PROFILE> aws ecr get-login --no-include-email --region eu-west-1)
ステップ1で返されたものを実行するだけで問題は解決します。
私は地域のオプションを追加し、すべてが私のためにうまく動作します。
aws ecr get-login --no-include-email --region eu-west-3
また、今日この問題に遭遇し、この記事で言及されていることをすべて試しました(AWS認証情報の生成を除く)。
我々はついにDockerをアップグレードすることによって問題を解決しました、そして、プッシュはうまくいきました。
この問題はDocker 1.10.xで発生し、Docker 1.11.xで解決されました。
お役に立てれば
aws ecr get-login
で正しい領域を使用していることを確認してください。これはリポジトリが作成された領域と一致している必要があります。
そのエラーメッセージはdockerから来ており、AWSを使用していないときにも同じエラーが発生するので必ずしもAWSに関連しているわけではありません。
私の場合は、テストで私はdirectory〜/ .dockerを削除してそのエラーを受け取りました...私が自分のローカルdockerレジストリをバウンスした後docker pushは大丈夫でした
aws ecr get-login --region us-west-1 --no-include-email
このコマンドは私に正しいログインコマンドを与えます。 "--no-include-email"を使用しないと、別のエラーが発生します。上記のコマンドの出力は、このdocker login -u AWS -pのようになります。**********************非常に大きい******それをコピーして実行してください。これで「ログイン成功」と表示されます。これで画像をECRにプッシュできます。
あなたのAMIルールがあなたがログインしようとしたユーザーに対する許可を持っていることを確認してください。
正しい資格情報を使用してログインしたことを確認する必要があります。公式のエラーの説明を参照して、ここで確認してください
http://docs.aws.Amazon.com/AmazonECR/latest/userguide/common-errors-docker.html
「基本認証なし」の修正はリンクに記載されています
これに対する回答をDockerフォーラムに投稿しました。私の場合、問題は、centos「docker」がDocker CEと同等ではないため、次のように失敗したことです。
基本認証なし
CentOSに「docker-ce」をインストールするだけで修正しました。
参照: https://forums.docker.com/t/docker-Push-to-ecr-failing-with-no-basic-auth-credentials/17358/
私の場合(そしておそらくすべての場合)、このエラーは複数のAWSアカウントを持っていることが原因でした。そのため、AWS ECRはawsアカウントに関連付けられた正しいaws認証情報を使用していません。
ここで述べた複数の解決策を試してみましたが、成功しませんでした。 ユーザー名とパスワードの代わりにトークンを使用した後に機能しました。私はそれをここの指示に従って動かしました。 https://btburnett.com/2017/01/docker-login-for-Amazon-aws-ecr-using-windows-powershell.html
AWSアカウントをCI/CD用に分離し、1つのECRリポジトリを複数のAWSアカウントで共有している場合は、手動で~/.docker/config.json
を変更する必要があります。
これらの設定があるとしましょう。
- ECRはAWSアカウントID
00000000000000
によって所有されています - CIサーバーはAWSアカウントID
99999999999999
によって所有されています
CIサーバー内でaws ecr get-login --region us-west-2 | bash
を呼び出すと、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.."
}
}
}
この状況は、ECRアクセスを許可するためのIAMユーザー/ポリシーの形成方法に依存しています。