[英]docker push to gcr.io fails with "denied: Token exchange failed for project"
我发现了一个通过 GCP 控制台工作但不通过gcloud
CLI 工作的gcloud
。
以下 bash 代码段创建了一个新的 GCP 项目并尝试将图像推送到 gcr.io,但即使用户是项目所有者也失败并显示“访问被拒绝”:
gcloud auth login
PROJECT_ID="example-project-20181120"
gcloud projects create "$PROJECT_ID" --set-as-default
gcloud services enable containerregistry.googleapis.com
gcloud auth configure-docker --quiet
mkdir ~/docker-source && cd ~/docker-source
git clone https://github.com/mtlynch/docker-flask-upload-demo.git .
LOCAL_IMAGE_NAME="flask-demo-app"
GCR_IMAGE_PATH="gcr.io/${PROJECT_ID}/flask-demo-app"
docker build --tag "$LOCAL_IMAGE_NAME" .
docker tag "$LOCAL_IMAGE_NAME" "$GCR_IMAGE_PATH"
docker push "$GCR_IMAGE_PATH"
结果
The push refers to repository [gcr.io/example-project-20181120/flask-demo-app]
02205dbcdc63: Preparing
06ade19a43a0: Preparing
38d9ac54a7b9: Preparing
f83363c693c0: Preparing
b0d071df1063: Preparing
90d1009ce6fe: Waiting
denied: Token exchange failed for project 'example-project-20181120'. Access denied.
在撰写本文时,系统是 Ubuntu 16.04 和最新版本的 gcloud 225.0.0 。 我授权的帐户具有角色roles/owner
。
我注意到,如果我通过 GCP Console 遵循相同的流程,我可以成功docker push
:
roles/owner
的服务帐号gcloud auth activate-service-account --key-file key.json
gcloud config set project $PROJECT_ID
gcloud auth configure-docker --quiet
docker tag "$LOCAL_IMAGE_NAME" "$GCR_IMAGE_PATH" && docker push "$GCR_IMAGE_PATH"
结果:按预期工作。 成功推送 docker 镜像到 gcr.io。
我还尝试使用gcloud auth login
作为我的 @gmail.com 帐户,然后使用该帐户通过 gcloud 创建一个服务帐户,但得到相同的denied
错误:
SERVICE_ACCOUNT_NAME=test-service-account
gcloud iam service-accounts create "$SERVICE_ACCOUNT_NAME"
KEY_FILE="${HOME}/key.json"
gcloud iam service-accounts keys create "$KEY_FILE" \
--iam-account "${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com"
gcloud projects add-iam-policy-binding "$PROJECT_ID" \
--member "serviceAccount:${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \
--role roles/owner
gcloud auth activate-service-account --key-file="${HOME}/key.json"
docker push "$GCR_IMAGE_PATH"
结果: denied: Token exchange failed for project 'example-project-20181120'. Access denied.
denied: Token exchange failed for project 'example-project-20181120'. Access denied.
我尝试使用您提供的 bash 片段重现相同的错误,但是它成功地为我构建了“flask-demo-app”容器注册表映像。 我使用以下步骤来重现该问题:
第 1 步:使用具有“角色:角色/所有者”和“角色:角色/编辑者”的帐户
第 2 步:使用给定的代码段创建 bash 脚本
第 3 步:在脚本中添加“gcloud auth activate-service-account --key-file skey.json”以对帐户进行身份验证
第 4 步:运行 bash 脚本
结果:它创建了“flask-demo-app”容器注册表镜像
这让我相信您的环境可能存在问题,导致您出现此错误。 要解决此问题,您可以尝试在不同的机器、不同的网络甚至Cloud Shell上运行您的代码。
就我而言,项目 IAM 权限是问题所在。 确保给予适当的权限并启用云资源/容器注册表 API。 GCP 访问控制
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.