无法推送到Google Container Registry(访问被拒绝)

时间:2019-01-02 23:52:29

标签: google-cloud-platform google-cloud-storage google-container-registry

当我尝试push a container image进入容器注册表时,它给了我以下错误,

  

拒绝:项目“ my-proj-123”的令牌交换失败。呼叫者没有权限“ storage.buckets.create”。要配置权限,请按照以下说明进行操作:https://cloud.google.com/container-registry/docs/access-control

我必须遵循Bucket Name Verification流程才能创建artifacts.my-proj-123.appspot.com存储桶。现在,当我尝试推送docker映像时,它不会抱怨storage.buckets.create权限,而只会给出:

  

拒绝:访问被拒绝。

我不知道我需要授予访问权。我没有授予 Storage Admin 访问 Compute Engine默认服务帐户的权限。我该如何解决?

3 个答案:

答案 0 :(得分:1)

您是否按照https://cloud.google.com/container-registry/docs/advanced-authentication的说明正确设置了身份验证?

答案 1 :(得分:1)

我能够将Docker映像从Container Optimized OS推送到Container Registry。

如果您遇到权限问题,建议您至少为 Compute Engine默认服务帐户授予项目编辑者权限,仅出于测试目的。即使您仅针对Cloud Storage,流程的其他部分也可能需要更多权限。测试完成后,您可以使用较少的权限创建一个新的服务帐户,并根据需要对其进行微调。

此外,authentication还有gcloud的替代方法。您可以按照以下步骤尝试:

  1. 首先尝试使用以下命令下载docker-credential-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
    
  2. 之后,执行docker-credential-gcr configure-docker

  3. 下载Compute Engine默认服务帐户json key

  4. 执行cat [your_service_account_credentials.json] | docker login -u _json_key --password-stdin https://[HOSTNAME]

答案 2 :(得分:0)

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

  1. 创建服务帐户并分配了存储管理员权限。
  2. 下载了JSON密钥
  3. 已执行docker-credential-gcr configure-docker
  4. 使用docker命令登录-docker login -u _json_key -p "$(cat ./mygcrserviceaccount.JSON)" https://gcr.io
  5. 试图推送图像gcr-docker push 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角色为我的服务帐户授予所有可能的权限,但是由于相同的错误,它会失败。

阅读此issue之后,我进行了以下更改,

  1. 删除了docker配置目录rm -rf ~/.docker
  2. 已执行docker-credential-gcr configure-docker
  3. 将JSON密钥存储到名为GOOGLE_APPLICATION_CREDENTIALS的变量中 GOOGLE_APPLICATION_CREDENTIALS=/path/to/mygcrserviceaccount.JSON
  4. 使用docker命令登录-docker login -u _json_key -p "$(cat ${GOOGLE_APPLICATION_CREDENTIALS})" https://gcr.io

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

Voila,它就像一个魅力!