无法将图片推送到Google容器注册表-调用者没有权限“ storage.buckets.get”

时间:2018-08-16 08:46:36

标签: docker google-cloud-platform google-container-registry google-cloud-iam

我正在研究将图像推送到gc容器注册表的位桶管道。 我已经创建了一个具有Storage Admin角色的服务帐户。 (bitbucket-authorization@mgcp-xxxx.iam.gserviceaccount.com)

enter image description here

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

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

谢谢!

14 个答案:

答案 0 :(得分:6)

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

这是我推送docker映像的最小角色(2)设置: auomationroles

云服务构建帐户角色添加了更多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工具设置角色和使用角色之间似乎存在一些延迟。但是,这是最小的,请考虑不到一分钟的范围。

欢呼

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

gcloud auth login

gcloud config set project <PROJECT_ID_HERE>

答案 3 :(得分:1)

添加服务帐户角色

在Google云端IAM上

Editor Storage object Admin Storage object Viewer

为我修复

答案 4 :(得分:0)

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

答案 5 :(得分:0)

对于遇到此问题的其他人,我的问题是我没有授予我的服务帐户Storage legacy bucket reader。我只授予了Object viewer。添加该旧版权限可以解决该问题。

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

答案 6 :(得分:0)

这些是循序渐进的命令,使我能够将第一个容器推送到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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

在将来,我发现我不再有任何旧选项。在这种情况下,我被迫授予完整的Storage Admin。我将为此向Google开票,这让我推图片有点极端。这可能会帮助将来的其他人。

答案 9 :(得分:0)

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

答案 10 :(得分:0)

我很难弄清楚这一点。

尽管错误消息相同,但我的问题是我在图像 URL 中使用了项目名称而不是项目 ID。

答案 11 :(得分:0)

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

答案 12 :(得分:0)

如果 docker 未通过 grc.io 进行身份验证,

docker push 命令将返回此权限错误

按照以下步骤操作。

  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>

答案 13 :(得分:0)

推送图片需要对象读写权限以及 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 权限。