无法将图像推送到 google 容器注册表 - 调用者没有权限 'storage.buckets.get'

Can't push image to google container registry - Caller does not have permission 'storage.buckets.get'

我正在开发用于将图像推送到 gc 容器注册表的 bitbucket 管道。 我创建了一个具有存储管理员角色的服务帐户。 (bitbucket-authorization@mgcp-xxxx.iam.gserviceaccount.com)

gcloud auth activate-service-account --key-file key.json
gcloud config set project mgcp-xxxx
gcloud auth configure-docker --quiet
docker push eu.gcr.io/mgcp-xxxx/image-name

虽然登录成功,但我得到: 项目 'mgcp-xxxx' 的令牌交换失败。来电者没有权限 'storage.buckets.get'。 要配置权限,请按照以下说明进行操作:https://cloud.google.com/container-registry/docs/access-control

任何人都可以就我缺少的东西提出建议吗?

谢谢!

过去我有另一个具有相同名称和不同权限的服务帐户。 在发现服务帐户名称被缓存后,我创建了一个具有不同名称的新服务帐户并且它正在正确推送。

GCR 仅使用 GCS 来存储图像检查您的工件的权限。同一项目内 GCS 中的文件夹。

对于遇到此问题的任何其他人,我的问题是我没有授予我的服务帐户 Storage legacy bucket reader。我只授予它 Object viewer。添加旧权限修复了它。

似乎docker仍在使用旧方法访问 GCR

这些 step-by 步骤命令让我将第一个容器推送到 GCE 私有存储库:

export PROJECT=pacific-shelter-218
export KEY_NAME=key-name1
export KEY_DISPLAY_NAME='My Key Name'

sudo gcloud iam service-accounts create ${KEY_NAME} --display-name ${KEY_DISPLAY_NAME}
sudo gcloud iam service-accounts list
sudo gcloud iam service-accounts keys create --iam-account ${KEY_NAME}@${PROJECT}.iam.gserviceaccount.com key.json
sudo gcloud projects add-iam-policy-binding ${PROJECT} --member serviceAccount:${KEY_NAME}@${PROJECT}.iam.gserviceaccount.com --role roles/storage.admin
sudo docker login -u _json_key -p "$(cat key.json)" https://gcr.io
sudo docker push  gcr.io/pacific-shelter-218/mypcontainer:v2

尝试了几件事,但看来你必须 运行 gcloud auth configure-docker

在未来,我发现我不再有任何旧版选项。在这种情况下,我被迫授予完整的存储管理员权限。关于这个我会用 Google 开一张票,让我推送一张图片有点极端。这可能会对未来的其他人有所帮助。

添加服务帐户角色

在 google 云 IAM

Editor Storage object Admin Storage object Viewer

帮我解决

对于所有阅读这里的人。这里的其他建议对我没有帮助,但我发现还需要 Cloud Service Build Account 角色。然后 storage.buckets.get 消失了。

这是我推送 docker 图片的最小角色 (2) 设置:

Cloud Service Build Account 角色不过增加了更多的权限,只是 storage.buckets.get。可以找到确切的权限 here.

注意:我很清楚Cloud Service Build Account角色也添加了storage.objects.get权限。但是,添加 roles/storage.objectViewer 并没有解决我的问题。不管它是否具有 storage.objects.get 权限。

如果上述方法不起作用,您可能激活了错误的帐户。这可以通过以下方式解决:

gcloud auth activate-service-account --key-file key.json

如果这不起作用,您可能需要设置 docker 凭据助手:

gcloud auth configure-docker --project <project_name>

最后一点。在设置角色和通过 gcloud 工具工作之间似乎有一些延迟。然而,这是最小的,想想不到一分钟的范围。

干杯

我认为差异在于 https://cloud.google.com/container-registry/docs/access-control 说,在 #permissions_and_roles 部分中您需要 Storage Admin 角色才能推送图像。然而,在解释如何配置访问的下一节中,它说添加 Storage Object Admin 以启用您正在访问的帐户的推送访问想配置。切换到 Storage Admin 应该可以解决问题。

您需要登录您的帐户并将项目设置为您想要的项目。您很有可能只是没有登录。

gcloud auth login

gcloud config set project <PROJECT_ID_HERE>

我很难弄清楚这一点。

虽然错误消息是一样的,但我的问题是我在图像中使用的是项目名称而不是项目 ID URL。

我创建了一个单独的服务帐户来处理 GCR IO。添加了 Artifact Registry Administrator 角色(我需要推送和拉取图像)并且它开始再次将图像推送到 GCR

如果 docker 未通过 grc.io

验证,

docker push 命令将 return 此权限错误

按照以下步骤操作。

  1. 创建服务帐户(或使用现有帐户)并授予以下权限

    • 存储管理员
    • 存储对象管理员
  2. 生成服务帐户密钥 (JSON) 并下载

  3. 运行 docker-credential-gcr configure-docker

  4. Docker 使用服务帐号登录

    docker login -u _json_key -p "$(cat [SERVICE_ACCOUNT_KEY.json])" https://gcr.io

  5. 尝试将您的 docker 图片推送到 gcr

    docker push gcr.io/<project_id>/<image>:<tag>

推送图片需要对象读写权限和storage.buckets.get权限。 Storage Object Admin 角色不包含 storage.buckets.get 权限,但 Storage Legacy Bucket Writer 角色包含。您可以在注释 https://cloud.google.com/container-registry/docs/access-control

下找到它

所以添加 Storage Legacy Bucket Writer 角色对我来说是固定的。由于 Storage Object Admin role 不需要 storage.buckets.get 权限。

对我有用的是 google 云控制台 -> I AM & Admin -> 将存储管理员设置为服务帐户的角色之一。

当我将图像从一个项目推送到另一个项目(有意地)并且没有记录我需要授予访问权限的存储桶时,花了太长时间来解决这个问题。

详情按照https://cloud.google.com/container-registry/docs/access-control

总而言之,要使用 Cloud Build 容器注册表推送映像,您需要将 Storage Legacy Bucket Writer 授予 {projectB -id}@cloudbuild.gserviceaccount.com {storage-region.}artifacts.{projectA- 上的服务帐户name}.appspot.com bucket.

文档似乎已经过时了 https://cloud.google.com/container-registry/docs/access-control

Note: Pushing images requires object read and write permissions as well as the storage.buckets.get permission. The Storage Object Admin role does not include the storage.buckets.get permission, but the Storage Legacy Bucket Writer role does.

但是Storage Legacy Bucket Writer角色不再可用。

为了解决权限问题,我向服务帐户添加了两个角色

  • 存储管理员
  • 存储对象查看器(它具有 storage.buckets.get 权限)

UI方法:

  1. https://console.cloud.google.com/iam-admin/iam
  2. 上添加权限
  3. 如 [1]
  4. 中所述,角色是“存储管理员”
  5. 然后刷新您的令牌:
    gcloud auth login
    gcloud config set project <PROJECT_ID_HERE>
  1. 再推

可以提供帮助的链接: [1] https://cloud.google.com/storage/docs/access-control/iam-roles [2] https://cloud.google.com/container-registry/docs/access-control#grant

在我的例子中,这个错误是由于存储 API(用于将 Google Container Registry 图像推送到)被放入 VPC 服务边界内引起的。

如果需要,可以通过查看可通过 VPC Service Controls troubleshooting page 访问的日志进一步确认和诊断。