[英]Can't push image to Amazon ECR - fails with "no basic auth credentials"
我正在嘗試將 docker 映像推送到 Amazon ECR 注冊表。 我正在使用 docker 客戶端 Docker 版本 1.9.1,構建a34a1d5
。 我使用aws ecr get-login --region us-east-1
來獲取 docker 登錄憑據。 然后我使用這些憑據成功登錄,如下所示:
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"
錯誤。 我不知道如何開始調試,因為所有流量都是加密的。
更新
所以當我意識到我的問題的根本原因時,我有一點 Homer Simpson 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)
它將為您完成
AWS CLI 的第 1 版現已棄用get-login
。 如果您使用的是 AWS CLI 的第 2 版,則必須使用get-login-password
。
您可以將get-login-password
的輸出通過管道get-login-password
到您的 docker login 命令,以驗證 docker 到您的 ECR 注冊表:
aws ecr get-login-password | docker login --username AWS --password-stdin ####.dkr.ecr.us-east-1.amazonaws.com
現在您應該能夠docker push
並將其直接發送到您的 ECR 注冊表。
如果您使用配置文件,請不要忘記將--profile=XXX
傳遞給aws ecr get-login
--profile=XXX
aws ecr get-login
。
由於 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
我也有這個問題。 發生在我身上的事情是我忘記運行運行后返回給我的命令
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
即使沒有打開權限,這也應該有效。 請參閱文檔: 私有注冊表身份驗證。
[編輯:實際上,我在進行第二次測試時也遇到了權限問題。 請參閱Docker 推送到 AWS ECR 私有存儲庫因格式錯誤的 JSON 失敗)。]
盡管如此,我還是遇到了同樣的問題; 我不知道為什么,但我成功地使用了文檔中描述的更冗長的身份驗證機制來獲取授權令牌
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 image 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]
命令,這也給出了“無基本身份驗證憑據”錯誤。
我的解決方案是改變我的命令:
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 憑據管理器中存在一個已知錯誤。 從生成的登錄命令中刪除“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 生成了aws ecr get-login --region us-east-1
login 命令。
eval $(aws ecr get-login --region us-east-1)
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
獲得的憑據是臨時的,會過期。
在PowerShell 中的Windows上,使用:
Invoke-Expression $(aws ecr get-login --no-include-email)
我遇到這個問題的原因不同:我需要推送到與我的 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
將您aws ecr get-login
到與您的登錄名相關聯的注冊表的 ECR,回想起來是有道理的。 解決方案是告訴aws ecr get-login
您要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 *****
,我只是復制了該命令的輸出,格式為docker login -u *** -p ************
,然后將其粘貼到提示中。 推動繼續進行。
剛剛有一個更新,從 AWS 中刪除了 get-login,而是使用 get-login-password:
sudo docker login -u AWS -p $(aws ecr get-login-password --region <region> -
-profile <profile>) <account id>.dkr.ecr.eu-north-1.amazonaws.com
如果使用默認憑據,請不要忘記刪除 --profile 標志
AWS 文檔告訴您執行以下命令(針對 ap-southeast-2 區域)
aws ecr get-login --region ap-southeast-2
當我遇到這個問題時,根據該文檔,我不清楚您需要將此命令的結果輸入終端並執行它。
對我有用的修復是將結果復制到剪貼板
aws ecr get-login --region ap-southeast-2 | pbcopy
將結果粘貼到命令行並執行
運行此命令后:
(aws ecr get-login --no-include-email --region us-west-2)
只需從輸出中運行 docker login 命令
docker login -u AWS -p epJ....
是docker登錄ECR的方式
aws-cli 給出的 docker 命令有點不對勁……
使用 docker login 時,docker 會在您的鑰匙串或 ~/.docker/config.json 文件中保存一個 server:key 對
如果它將密鑰保存在https://7272727.dkr.ecr.us-east-1.amazonaws.com
推送期間查找密鑰將失敗,因為7272727.dkr.ecr.us-east-1.amazonaws.com
將尋找名為7272727.dkr.ecr.us-east-1.amazonaws.com
的服務器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'
消息,然后您就可以了
之后你的推送命令應該可以工作
如果 ecr 登錄失敗,通常會拋出此錯誤。 我使用的是 Windows 系統,我在管理員模式下使用“Powershell”首先登錄到 ecr。
Invoke-Expression $(aws ecr get-login --no-include-email)
這應該輸出“登錄成功”。
Docker CLI 不支持本機 IAM 身份驗證方法。 要驗證和授權 Docker 推送和拉取請求,請遵循此步驟。
第1步
檢查 aws 憑據是否正確配置。 要配置 AWS 憑證,請運行以下命令並提供您的 aws 憑證。
aws configure
第2步
您可以使用 get-login-password 向 Amazon ECR 私有注冊表驗證 Docker(推薦)
linux 和 msc
aws ecr get-login-password --region <your region> | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<your region>.amazonaws.com
用於窗戶
(Get-ECRLoginCommand).Password | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.<your region>.amazonaws.com
要么
您還可以使用 --get-login 方法(但公開憑據)(不推薦)。
適用於 linux 和 mac
$(aws ecr get-login --region <your region> --no-include-email)
用於窗戶
Invoke-Expression -Command (Get-ECRLoginCommand -Region <your region>).Command
如果您登錄成功,那么您就可以開始了。 否則請參閱aws 文檔以獲取錯誤
步驟 - 3
標記您的圖像
docker 標簽 <aws_account_id>.dkr.ecr..amazonaws.com/my-web-app
使用以下命令推送您的圖像。
docker push <aws_account_id>.dkr.ecr..amazonaws.com/my-web-app
注意:這是基於令牌的登錄,生成的授權令牌僅對 12H 有效
我遇到了同樣的問題,我犯的錯誤是使用了錯誤的回購路徑
例如: docker push xxxxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/jenkins:latest
在上面的路徑中,這是我犯錯誤的地方:在"dkr.ecr.us-east-1.amazonaws.com"
而不是"west"
。 我用的是“ east"
。 一旦我糾正了我的錯誤,我就能夠成功推送圖像。
以下命令對我有用:
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
只是添加到這一點,以防有人像我一樣從不閱讀 F 手冊
我按照上面的所有建議步驟進行操作,例如
aws ecr get-login-password --region eu-west-1 | docker login --username AWS --password-stdin 123456789.dkr.ecr.eu-west-1.amazonaws.com
並且總是沒有基本的身份驗證憑據
我創建了一個名為的注冊表
123456789.dkr.ecr.eu-west-1.amazonaws.com/my.registry.com/namespace
並試圖推送一個名為 alpine:latest 的圖像
123456789.dkr.ecr.eu-west-1.amazonaws.com/my.registry.com/namespace/alpine:latest
2c6e8b76de: Preparing
9d4cb0c1e9: Preparing
1ca55f6ab4: Preparing
b6fd41c05e: Waiting
ad44a79b33: Waiting
2ce3c1888d: Waiting
no basic auth credentials
代表我犯了一個愚蠢的錯誤,因為我必須使用完整的容器路徑在 ecr 中創建一個注冊表。
我使用完整的容器路徑創建了一個新的注冊表,而不是以命名空間結束
123456789.dkr.ecr.eu-west-1.amazonaws.com/my.registry.com/namespace/alpine
和低看推到
123456789.dkr.ecr.eu-west-1.amazonaws.com/my.registry.com/namespace/alpine:latest
The push refers to repository [123456789.dkr.ecr.eu-west-1.amazonaws.com/my.registry.com/namespace/alpine]
0c8667b5b: Pushed
730460948: Pushed
1.0: digest: sha256:e1f814f3818efea45267ebfb4918088a26a18c size: 7
工作得很好
我在 OSX 上運行時也遇到了這個問題。 我看到了 Oliver Salzburg 的回復並檢查了我的 ~/.docker/config.json。 它有多個來自我擁有的不同 AWS 賬戶的授權憑證。 我刪除了該文件,並在再次運行 get-login 后它起作用了。
確保在aws ecr get-login
使用正確的區域,它必須與創建存儲庫的區域相匹配。
我的問題是有多個 AWS 憑證; 默認和開發。 由於我試圖部署到開發人員,因此工作正常:
$(aws ecr get-login --no-include-email --region eu-west-1 --profile dev | sed 's|https://||')
FWIW,Debian 9,Docker 版本 18.06.1-ce,構建 e68fc7a:
$(aws ecr get-login | sed 's| -e none | |g')
如果您使用多個配置文件並且需要登錄到非默認配置文件,則需要使用以下命令登錄:
$(AWS_PROFILE=<YOUR PROFILE> aws ecr get-login --no-include-email --region eu-west-1)
有一種非常簡單的方法可以將 docker 鏡像推送到 ECR: Amazon ECR Docker Credential Helper 。 只需根據提供的指南安裝它,更新你的~/.docker/config.json
如下:
{
"credsStore": "ecr-login"
}
你將能夠在沒有docker login
情況下推/拉你的圖像。
cat ~/.docker/config.json
示例結果:
{
"auths": {
"https://55511155511.dkr.ecr.us-east-1.amazonaws.com": {}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/19.03.5 (darwin)"
},
"credsStore": "osxkeychain"
}
請注意,“auths”值是一個空對象,並且 docker 正在使用憑證存儲“osxkeychain”。
注意Where:
字段
~/.docker/config.json
中的auths
鍵與鑰匙串訪問中的Where:
字段匹配。 如果 ~/.docker/config.json 中的auths
鍵與鑰匙串中的Where:
字段不匹配,您可能會從docker login...
獲得Login Succeeded
docker login...
但仍然得到ERROR: Service 'web' failed to build: Get https://55511155511.dkr.ecr.us-east-1.amazonaws.com/v2/path/to/image/latest: no basic auth credentials
嘗試拉取時ERROR: Service 'web' failed to build: Get https://55511155511.dkr.ecr.us-east-1.amazonaws.com/v2/path/to/image/latest: no basic auth credentials
。
就我而言,我需要添加https://
原來的
"auths": {
"55511155511.dkr.ecr.us-east-1.amazonaws.com": {}
},
固定的
"auths": {
"https://55511155511.dkr.ecr.us-east-1.amazonaws.com": {}
},
我也在為此苦苦掙扎。 請按照以下步驟操作 -
請注意 - in.dkr.ecr.us-west-2.amazonaws.com,該區域將是您的默認區域。 對我來說是 us-west-2,因此也是一樣的。
希望這可以節省您的時間。
我們今天也遇到了這個問題並嘗試了本文中提到的所有內容(生成AWS憑證除外)。
我們最終通過簡單地升級Docker解決了這個問題,然后推動了工作。
Docker 1.10.x遇到了問題,並使用Docker 1.11.x解決了這個問題。
希望這可以幫助
如果要隔離用於CI / CD目的的AWS賬戶並在多個AWS賬戶之間共享一個ECR存儲庫,則可能需要手動更改~/.docker/config.json
。
假設你有這些設置:
00000000000000
99999999999999
如果你打電話給aws ecr get-login --region us-west-2 | bash
在CI服務器中進行aws ecr get-login --region us-west-2 | bash
, ~/.docker/config.json
將在~/.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訪問。
您必須確保使用正確的憑據登錄,請參閱官方錯誤說明並在此處進行檢查
http://docs.aws.amazon.com/AmazonECR/latest/userguide/common-errors-docker.html
鏈接中描述了修復“無基本身份驗證”
aws ecr get-login --region us-west-1 --no-include-email
此命令為我提供了正確的登錄命令。 如果你不使用“--no-include-email”,它將引發另一個錯誤。 上面命令的輸出看起來像這個docker登錄-u AWS -p **********************非常大的******。 復制並執行它。 現在它將顯示“Login Succeeded”。 現在您可以將圖像推送到ECR。
確保您的AMI規則具有您嘗試登錄的用戶的權限。
只需運行第一步中返回的任何內容即可解決問題。
該錯誤消息來自docker,它不一定與AWS有關,因為我在不使用AWS時遇到了同樣的錯誤...它只是說docker沒有獲得授權從任何來源的auth進行處理它碰巧正在使用
在我的情況下,在測試中我刪除了目錄〜/ .docker並得到了該錯誤...在我彈回我的本地docker注冊表然后docker push很好
在我的情況下(可能在所有情況下),此錯誤是由於擁有多個AWS賬戶造成的。 因此,AWS ECR未使用與aws帳戶相關的正確aws憑據。
我試過這里提到的多個解決方案,但沒有成功。 它在使用令牌而不是用戶名和密碼后起作用 。 我按照這里的說明工作了。 https://btburnett.com/2017/01/docker-login-for-amazon-aws-ecr-using-windows-powershell.html
我添加了區域選項,一切正常對我來說很好:
aws ecr get-login --no-include-email --region eu-west-3
我在 Docker 論壇上發布了一個答案。 就我而言,問題是 centos “docker” 不等同於 Docker CE,因此失敗:
沒有基本身份驗證
我只是通過在 centos 上安裝“docker-ce”來修復。
參考: https://forums.docker.com/t/docker-push-to-ecr-failing-with-no-basic-auth-credentials/17358/30
我遇到了同樣的問題並用這個命令修復了它。 它對我有用,請根據您的帳戶更新它。 這適用於 Ubuntu 機器,其中 AWS-CLI 需要安裝 Docker
algorithm_name='multi-model-xgboost'
account=$(aws sts get-caller-identity --query Account --output text)
# Get the region defined in the current configuration
region=$(aws configure get region)
aws ecr get-login-password --region ${region} | docker login --username AWS --password-stdin ${account}.dkr.ecr.${region}.amazonaws.com/${algorithm_name}
所以我通過下載 repo 並自己編譯來安裝aws-credentials-helper
。 我發現我使用了錯誤的編譯命令: make docker
而不是make docker TARGET_GOOS=darwin
(我在 Mac 上)。 生成的bin/local/docker-credential-ecr-login
最初無法執行。
I had to run aws ecr get-login-password due to aws cli deprecating the get-login command.
Also in this version the username is forced to be hard coded as AWS.
Here was the command that worked for aws-cli/2.0.58.
aws ecr get-login-password --region region_y | docker login --username AWS --password-stdin account_x.dkr.ecr.region_y.amazonaws.com
登錄成功
在 Windows 系統上,您必須清空以下文件~/.docker/config.json
然后再次運行以下腳本
aws ecr get-login --no-include-email --region ap-southeast-1 --profile [profile_name]
確保您在本地運行 Docker 的用戶是您最終用於推送映像的用戶。 對我來說,使用 sudo 運行導致了這個問題。 從命令中刪除 sudo 解決了它。 希望這有助於並節省某人的時間,並且沒有人再次犯同樣的愚蠢錯誤。 下面是 output 供您參考。
sudo docker push {your-account-id}.dkr.ecr.us-east-1.amazonaws.com/{repository-name}:{tag-name}
The push refers to repository [{your-account-id}.dkr.ecr.us-east-1.amazonaws.com/{repository-name}]
f13afaa342eb: Preparing
d01b75ce3235: Preparing
7eaa58141607: Preparing
519e8c5b2557: Preparing
15d4a3a33fec: Preparing
fdbbf41b1ab8: Waiting
4b88ecda5399: Waiting
e23a8e1e773f: Waiting
6623e2cc11cd: Waiting
no basic auth credentials
在沒有 sudo 的情況下運行非常好
docker push {your-account-id}.dkr.ecr.us-east-1.amazonaws.com/{repository-name}:{tag-name}
The push refers to repository [{your-account-id}.dkr.ecr.us-east-1.amazonaws.com/{repository-name}]
f13afaa342eb: Pushed
d01b75ce3235: Pushed
7eaa58141607: Pushed
519e8c5b2557: Pushed
15d4a3a33fec: Pushed
fdbbf41b1ab8: Pushed
4b88ecda5399: Pushed
e23a8e1e773f: Pushed
6623e2cc11cd: Pushed
{tag-name}: digest: sha256:5ceaa5bf7605559582960b6d56a8eece9486ce0950bca9dd63a0dcd38a520bf0 size: 4293
AWS depriated get-login 而不是那個,請使用以下命令
aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <ecr-repo-full-path>
例子
aws ecr get-login-password --region ap-south-1 | docker login --username AWS --password-stdin 607348619222.dkr.ecr.ap-south-1.amazonaws.com
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.