繁体   English   中英

docker push to gcr.io 失败并显示“拒绝:项目令牌交换失败”

[英]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 不一致

我注意到,如果我通过 GCP Console 遵循相同的流程,我可以成功docker push

  1. 通过 GCP Console 创建一个新的 GCP 项目
  2. 通过 GCP Console 创建具有roles/owner的服务帐号
  3. 下载服务帐号的 JSON 密钥
  4. 通过 GCP Console 启用容器注册表 API
  5. gcloud auth activate-service-account --key-file key.json
  6. gcloud config set project $PROJECT_ID
  7. gcloud auth configure-docker --quiet
  8. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM