docker - docker push to gcr.io 失败并显示“拒绝:项目的令牌交换失败”
问题描述
我发现了一个可以通过 GCP 控制台工作但不能通过gcloud
CLI 工作的流程。
最小复制
以下 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
成功:
- 通过 GCP Console 创建一个新的 GCP 项目
roles/owner
通过 GCP Console创建服务帐号- 下载服务帐号的 JSON 密钥
- 通过 GCP Console 启用容器注册表 API
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.
解决方案
在我的情况下,项目 IAM 权限是问题所在。确保给予适当的许可并启用云资源/容器注册表 API。 GCP 访问控制
推荐阅读
- python - “latin-1”编解码器无法编码字符
- angular - 如何在不更改 @Input 引用的情况下使用 OnPush 策略更新 Angular UI?
- node.js - Heroku 给出 503 Unserviceable 但在本地运行良好
- python - Python pandas - 将具有多个日期索引的csv合并到单个日期索引
- r - Shiny:基于 .Rmd 文件中的 input$var 对 ggplot 进行子集化
- optimization - 如何为 Yocto 构建组织下载和 sstate_cache?
- javascript - 我想将几个数据数组推送到 Javascript 中的二维数组中
- python-3.x - 使用 Python 请求 post() 方法向 Dynamics 365 发送数据以创建事件
- django - 有没有办法我可以加入两个表并获得 Django 中重复字段的总和
- python - 从重叠的 matplotlib 子图中删除白色背景