首页 > 解决方案 > docker push to gcr.io 失败并显示“拒绝:项目的令牌交换失败”

问题描述

我发现了一个可以通过 GCP 控制台工作但不能通过gcloudCLI 工作的流程。

最小复制

以下 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 控制台不一致

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

  1. 通过 GCP Console 创建一个新的 GCP 项目
  2. roles/owner通过 GCP Console创建服务帐号
  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.

标签: dockergoogle-cloud-platformgcloud

解决方案


在我的情况下,项目 IAM 权限是问题所在。确保给予适当的许可并启用云资源/容器注册表 API。 GCP 访问控制


推荐阅读