无法将镜像推送到Google容器注册表 - 调用方没有“storage.buckets.get”权限。

26

我正在为将镜像推送到Google Cloud容器注册表的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 有人可以告诉我错过了什么吗?
谢谢!

你能展示一下Docker守护进程日志的输出吗?https://dev59.com/zF0Z5IYBdhLWcg3w3Dfk#30970134 - Chris Stryczynski
2
谷歌云认证激活服务账号 --key-file key.json。谢谢! - Steven Kaspar
20个回答

29

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

这是我最小角色(2)设置以推送 Docker 映像的方式:auomationroles

然而,Cloud Service Build Account 角色添加了更多权限,而不仅仅是 storage.buckets.get。确切的权限可以在此处找到。

注意:我非常清楚 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 工具设置角色和它实际生效之间可能会有一些延迟。不过这种情况非常少见,只有不到一分钟的时间。

谢谢!


1
loud auth activate-service-account --key-file 对我来说是解决方案。谢谢。 - Jørgen
2
谢谢!不确定他们是否更改了名称,但现在它被称为“Cloud Build服务帐户”,而不是“Cloud Service Build Account”。如果您需要从命令行或API设置它,则角色的名称为roles/cloudbuild.builds.builder - Matt Browne
谢谢,云服务构建帐户角色绝对是必需的,谷歌文档中缺少了这个。 - Thomas Ducrot

20

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

gcloud auth login

gcloud config set project <PROJECT_ID_HERE>


这解决了我的错误。另一个项目被配置为默认。 - uriz
这是我的问题,并且我在一个关键时刻遇到了区分GCP上的帐户ID和项目ID的困难。这确实解决了我的问题。基本上,如果你将一个项目更改为另一个项目,则需要使用gcloud config... - Manabu Tokunaga

19

过去我曾使用一个与现在同名但权限不同的服务账户。发现服务账户名称被缓存后,我创建了一个新的账户,并成功地推送了它。


正是我在寻找的答案! - Kitanotori

6

以下是一些逐步命令,可以将第一个容器推送到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

1
谢谢!那最终对我起作用了。我尝试通过UI创建服务帐户,但它根本不起作用。我永远不会知道为什么。 - jpbochi
我在UI方面遇到了类似的问题。通过添加角色:Editor,我设法使其通过UI工作...但是我承认这是一种相当鲁莽和不安全的方法。 - andrew pate
使用服务账户作为用户账户是一个糟糕的想法。用户应该使用用户账户。 - Francisco Delmar Kurpiel

5

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

注意:推送镜像需要对象读取和写入权限,以及 storage.buckets.get 权限。Storage Object 管理员角色不包括 storage.buckets.get 权限,但 Storage Legacy Bucket Writer 角色包括。

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

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

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

我相当确定管理员也包括“查看者”...所以第二个角色可能是多余的! - Dewey

4

对于其他人来说,我的问题是我没有授予我的服务帐户“存储遗留桶读取器”的权限。 我只授予了它“对象查看器”的权限。 添加该遗留权限即可解决。

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


谢谢,我这里也有同样的问题! - the pillow

3

在这个时候,我发现我已经没有任何遗留选项了。因此,我被迫授予完整的存储管理员权限。我会向谷歌提交工单,因为这样做有些过度,只是为了让我推送一张图片。这可能会对未来的其他人有所帮助。


2

尝试了几种方法,但似乎您需要运行 gcloud auth configure-docker


2

GCR只是使用GCS来存储图像,请检查在同一项目中的GCS中artifacts文件夹的权限。


1

添加服务账户角色

在谷歌云 IAM 上

编辑者 存储对象管理员 存储对象查看器

为我修复


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接