【问题标题】:Unable to Push to Google Container Registry (access denied)无法推送到 Google Container Registry(访问被拒绝)
【发布时间】:2019-05-29 14:15:22
【问题描述】:

当我尝试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 AdminCompute Engine 默认服务帐号 的访问权限,但无济于事。我该如何解决?

【问题讨论】:

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


    【解决方案1】:

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

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

    此外,gcloud 还可以替代 authentication。您可以按照以下方式尝试:

    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]

    【讨论】:

    • 对于最后一部分,我必须运行 docker login -u _json_key -p "$(cat keyfile.json)" https://[HOSTNAME] 才能获得“登录成功”。但结果与运行docker-credential-gcr gcr-login 相同。它登录,并且可以docker push 图像,但它显然没有创建清单文件,因此不能docker pull。请参阅我对@shou3301 的回复。
    • 我删除了bucked并且它有效。 (来自SO post的提示)
    • 使用 json 键,docker-credential-gcr 并不是真正需要的。
    【解决方案2】:

    我在尝试将 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 config 目录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

    瞧,它就像一个魅力!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      • 2016-07-06
      • 2016-12-10
      • 1970-01-01
      • 2017-06-03
      • 2020-10-18
      • 1970-01-01
      相关资源
      最近更新 更多