17

我尝试使用本教程将我的 docker 容器推送到谷歌容器注册表,但是当我运行时

gcloud docker push b.gcr.io/my-bucket/image-name

我得到错误:

The push refers to a repository [b.gcr.io/my-bucket/my-image] (len: 1)
Sending image list
Error: Status 403 trying to push repository my-bucket/my-image: "Access denied."

我找不到更多解释(没有识别出 -D、--debug、--verbose 参数),gcloud auth listdocker info告诉我我已连接到这两个服务。

有什么我想念的吗?

4

10 回答 10

10

您需要确保 VM 实例具有足够的访问权限。您可以在创建实例时设置这些,或者如果您已经创建了实例,您也可以对其进行编辑(但首先,您需要停止实例)。有两种方法可以管理此访问:

选项1

在 Identity and API access 下,选择Allow full access to all Cloud APIs

在此处输入图像描述

选项 2(推荐)

在身份和 API 访问权限下,为每个 API 选择设置访问权限,然后为存储选择读写

在此处输入图像描述

请注意,即使您已经创建了实例,也可以更改这些设置。为此,您首先需要停止实例,然后如上所述编辑配置。

于 2017-05-22T14:34:50.877 回答
5

用于gsutil检查 ACL 以确保您有权写入存储桶:

$ gsutil acl get gs://<my-bucket>

您需要检查您使用的帐户所在的组(“所有者”、“编辑者”、“查看者”等)

编辑:我自己最近遇到了一个非常相似的问题,正如@lampis 在他的帖子中提到的那样,这是因为当我创建我试图从中推送图像的 VM 时没有设置正确的权限范围。不幸的是,一旦创建了 VM,目前无法更改范围,因此您必须删除 VM(确保磁盘设置为自动删除!)并使用正确的范围重新创建 VM('compute-rw' , 'storage-rw' 似乎就足够了)。但这并不需要很长时间;-)。

请参阅--scopes此处的部分:https ://cloud.google.com/sdk/gcloud/reference/compute/instances/create

于 2015-07-06T09:50:46.023 回答
4

对我来说,我忘gcloud了在行中添加前缀(我想知道如何docker进行身份验证):

$ gcloud docker push <image>
于 2015-09-05T09:44:40.297 回答
4

I am seeing this but on an intermittent basis. e.g. I may get the error denied: Permission denied for "latest" from request "/v2/...."., but when trying again it will work.

Is anyone else experiencing this?

于 2017-06-29T02:36:40.437 回答
2

在您的终端中,运行以下代码

$ sudo docker login -u oauth2accesstoken -p "$(gcloud auth print-access-token)" https://[HOSTNAME]

其中 -[HOSTNAME] 是您的容器注册表位置(它是 gcr.io、us.gcr.io、eu.gcr.io 或 asia.gcr.io)。通过运行检查您的标记图像以确保$ sudo docker images)。

如果这不能解决问题,请尝试查看 VM 的访问范围。

于 2019-10-27T02:11:10.633 回答
1

如果您使用的是 Docker 1.7.0,那么他们处理身份验证的方式发生了重大变化,这会影响混合使用gcloud dockerdocker login.

确保您通过以下方式使用最新版本的 gcloud:gcloud components update

到目前为止,这似乎影响了gcloud docker以及docker-compose其他正在读取/写入 Docker 身份验证文件的工具。

希望这会有所帮助。

于 2015-07-22T16:05:36.360 回答
1

同样的问题,来自https://cloud.google.com/tools/container-registry/#access_denied的故障排除部分不是很有帮助。我已经完全更新了 Docker 和 GCloud。不知道还能做什么。

顺便说一句,我正在尝试推送到“gcr.io”。

固定的。我在计算引擎中使用虚拟机作为我的开发机器,看起来我在存储中没有给它足够的权限。

于 2015-08-10T17:30:45.137 回答
0

您需要从您所在的机器登录 gcloud:

gcloud auth login
于 2018-07-28T21:07:59.533 回答
0

今天,在推送 docker 容器时,我在 Google Kubernetes Engine 上运行的 Jenkins 内部也遇到了这个错误。原因是我之前在 gcp 中将节点池节点版本从 1.9.6-gke.1 升级到 1.9.7-gke.0。降级后再次工作。

于 2018-05-10T13:33:50.540 回答
0

我在拒绝访问时遇到了同样的问题,我通过使用Tag创建新图像解决了这个问题:

docker tag IMAGE_WITH_ACCESS_DENIED gcr.io/my-project/my-new-image:test

之后我可以将它送到容器注册表:

gcloud docker -- push gcr.io/my-project/my-new-image:test
于 2017-10-25T16:11:37.327 回答