【问题标题】:Google Container Registry access denied when pushing docker container推送 docker 容器时 Google Container Registry 访问被拒绝
【发布时间】:2015-07-05 22:25:51
【问题描述】:

我尝试使用 this tutorial 将我的 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 告诉我我已连接到这两个服务。

我缺少什么?

【问题讨论】:

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


    【解决方案1】:

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

    选项 1

    在身份和 API 访问下,选择允许完全访问所有云 API

    选项 2(推荐)

    在 Identity and API access 下,选择 为每个 API 设置访问权限,然后选择 Read Write for Storage。

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

    【讨论】:

    • 我只需要允许对所有云 API 进行完全访问。谢谢!
    • 不得不花费大量时间尝试调试此问题。您允许完全访问云 API 的解决方案最终解决了它。非常感谢!
    【解决方案2】:

    使用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

    【讨论】:

    • 这就是问题所在:我在所有者组中,并且所有者组成员对此存储桶拥有所有者权限。仍然拒绝访问
    • 当你运行gcloud auth list时,你所指的所有者肯定有(active)反对它?
    • 抱歉耽搁了,所以没有向我发送通知。您使用的是 Docker 1.7.0 吗? Docker 在 1.7.0 中对他们进行身份验证的方式进行了重大更改,但您应该尝试gcloud components update。我们更新了文档以包含此内容:cloud.google.com/tools/container-registry/#access_denied
    • 我遇到了 ACL 问题,在存储桶 ACL 上定义 SA 用户已修复。
    【解决方案3】:

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

    $ gcloud docker push <image>
    

    【讨论】:

    • 这已经过时了。 gcloud 现在为 docker 提供身份验证。
    【解决方案4】:

    我看到这一点,但只是间歇性的。例如我可能会收到错误被拒绝:请求“/v2/....”的“最新”权限被拒绝,但再次尝试时它会起作用。

    还有其他人遇到这种情况吗?

    【讨论】:

    • 在我的情况下,我相信它实际上是 us-central1 中的一个临时问题。
    【解决方案5】:

    在你的终端中,运行下面的代码

    $ 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 的访问范围。

    【讨论】:

      【解决方案6】:

      如果您使用的是 Docker 1.7.0,他们处理身份验证的方式发生了重大变化,这会影响同时使用 gcloud dockerdocker login 的用户。

      确保您使用的是最新版本的 gcloud:gcloud components update

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

      希望这会有所帮助。

      【讨论】:

      • 根据操作系统,您需要相应地设置用户权限。这意味着,如果您使用gcloud 而不使用sudo,您需要确保您也可以使用docker 命令而不使用sodo。如果您使用的是 ubuntu,请参阅 here 了解更多信息。
      【解决方案7】:

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

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

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

      【讨论】:

        【解决方案8】:

        我在 access denied 中遇到了同样的问题,我通过使用 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
        

        【讨论】:

          【解决方案9】:

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

          【讨论】:

            【解决方案10】:

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

            gcloud auth login
            

            【讨论】:

              猜你喜欢
              • 2019-05-29
              • 2017-11-09
              • 2017-07-02
              • 1970-01-01
              • 2016-12-10
              • 1970-01-01
              • 2023-03-27
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多