Google cloud platform 无法推送到Google容器注册表(访问被拒绝)

Google cloud platform 无法推送到Google容器注册表(访问被拒绝),google-cloud-platform,google-cloud-storage,google-container-registry,Google Cloud Platform,Google Cloud Storage,Google Container Registry,当我试图访问容器注册表时,它给了我以下错误 拒绝:项目“my-proj-123”的令牌交换失败。调用方没有“storage.bucket.create”权限。要配置权限,请按照以下位置的说明进行操作: 我必须遵循这个过程才能创建artifacts.my-proj-123.appspot.combucket。现在,当我尝试推送docker映像时,它不会抱怨storage.bucket.create权限,只会给出: 拒绝:访问被拒绝 我不知道我需要授予哪个用户访问权限。我给了存储管理员访问计算引擎默

当我试图访问容器注册表时,它给了我以下错误

拒绝:项目“my-proj-123”的令牌交换失败。调用方没有“storage.bucket.create”权限。要配置权限,请按照以下位置的说明进行操作:

我必须遵循这个过程才能创建
artifacts.my-proj-123.appspot.com
bucket。现在,当我尝试推送docker映像时,它不会抱怨
storage.bucket.create
权限,只会给出:

拒绝:访问被拒绝


我不知道我需要授予哪个用户访问权限。我给了存储管理员访问计算引擎默认服务帐户的权限,但没有用。如何修复它?

我能够将Docker映像从服务器推送到容器注册表

如果您有权限问题,我建议您至少为计算引擎默认服务帐户授予项目编辑器权限,仅用于测试目的。即使只是针对云存储,流程的其他部分也可能需要更多权限。完成测试后,您可以使用较少的权限创建新的服务帐户,并根据需要对其进行微调

此外,还有一种替代
gcloud
的方法。您可以通过以下方式进行尝试:

  • 首先尝试下载docker凭据gcr,方法是:

    VERSION=1.5.0
    OS=linux  # or "darwin" for OSX, "windows" for Windows.
    ARCH=amd64  # or "386" for 32-bit OSs
    
    curl -fsSL "https://github.com/GoogleCloudPlatform/docker-credential-gcr/releases/download/v${VERSION}/docker-credential-gcr_${OS}_${ARCH}-${VERSION}.tar.gz" \
      | tar xz --to-stdout ./docker-credential-gcr \
      > /usr/bin/docker-credential-gcr && chmod +x /usr/bin/docker-credential-gcr
    
  • 然后执行
    docker凭证gcr配置docker

  • 下载计算引擎默认服务帐户

  • 执行
    cat[your_service\u account\u credentials.json]| docker login-u\u json\u key--password stdin https://[HOSTNAME]


  • 当我试图从容器优化操作系统将docker映像上载到GCR时,我遇到了类似的问题,我运行了以下命令序列

  • 创建了服务帐户并分配了存储管理员权限
  • 下载了JSON密钥
  • 已执行
    docker凭证gcr配置docker
  • 使用docker命令登录-
    docker登录-u_json_key-p“$(cat./mygcrserviceaccount.json)”https://gcr.io
  • 已尝试推送图像gcr-
    docker推送gcr.io/project id/imagename:tage01
  • 它失败了,错误如下:

    denied: Token exchange failed for project 'project-id'. Caller does not have permission 'storage.buckets.create'. To configure permissions, follow instructions at: https://cloud.google.com/container-registry/docs/access-control
    
    我尝试通过IAM角色为我的服务帐户授予所有可能的权限,但失败的原因是相同的错误

    读了这篇文章后,我做了以下修改

  • 删除了docker配置目录
    rm-rf~/.docker
  • 已执行
    docker凭证gcr配置docker
  • 将JSON密钥存储到名为GOOGLE\u APPLICATION\u CREDENTIALS的变量中
    GOOGLE\u应用程序\u凭据=/path/to/mygcrserviceaccount.JSON
  • 使用docker命令登录-
    docker登录-u\u json\u key-p“$(cat${GOOGLE\u应用程序\u凭据})”https://gcr.io

  • 已执行docker push命令-
    docker push gcr.io/project id/imagename:tage01


  • 瞧,它像一个符咒

    对于最后一部分,我必须运行
    docker login-u\u json\u key-p“$(cat keyfile.json)”https://[HOSTNAME]
    才能获得“登录成功”。但结果与运行
    docker credential gcr gcr login
    相同。它登录,可以
    docker推送
    图像,但显然它没有创建清单文件,因此不能
    docker推送
    。见我对@shou3301的回复。我删除了bucked,它成功了。(本文提示)使用json密钥,实际上并不需要docker凭证gcr。