1

按照Google Artifact Registry Quickstart中的说明使用时,我看到了权限错误。如该问题所述,问题似乎归结为访问令牌上缺少范围。在我的本地 shell 中,范围是这些(如 所示):docker pushhttps://www.googleapis.com/oauth2/v1/tokeninfo?access_token=<token>

openid https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/appengine.admin https://www.googleapis.com/auth/compute https://www.googleapis.com/auth/accounts.reauth

当我在 Cloud Shell 中运行相同的步骤序列时,访问令牌上有更多范围:

https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/appengine.admin https://www.googleapis.com/auth/bigquery https://www.googleapis.com/auth/compute https://www.googleapis.com/auth/devstorage.full_control https://www.googleapis.com/auth/devstorage.read_only https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/ndev.cloudman https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/sqlservice.admin https://www.googleapis.com/auth/prediction https://www.googleapis.com/auth/projecthosting https://www.googleapis.com/auth/source.full_control https://www.googleapis.com/auth/source.read_only https://www.googleapis.com/auth/source.read_write openid"

我无法确定我的 Cloud Shell 配置和我的本地配置之间的差异可能会导致这种范围差异。这些命令都具有相同的输出:

$ gcloud auth list
Credentialed Accounts

ACTIVE: *
ACCOUNT: <my email address>
$ cat ~/.docker/config.json
{
  "credHelpers": {
    "gcr.io": "gcloud",
    "us.gcr.io": "gcloud",
    "eu.gcr.io": "gcloud",
    "asia.gcr.io": "gcloud",
    "staging-k8s.gcr.io": "gcloud",
    "marketplace.gcr.io": "gcloud",
    "us-central1-docker.pkg.dev": "gcloud"
  }
}

gcloud config list显示这些差异:

// in Cloud Shell
[accessibility]
screen_reader = True
[component_manager]
disable_update_check = True
[compute]
gce_metadata_read_timeout_sec = 30
[core]
account = <my email address>
disable_usage_reporting = True
project = <my project>
[metrics]
environment = devshell

// on my local machine
[core]
account = <my email address>
disable_usage_reporting = True
pass_credentials_to_gsutil = false
project = <my project>

问题:

  1. 无论如何,这里的范围是什么?它们与分配给项目负责人 ( ) 的角色有什么关系example@stackoverflow.com
  2. 什么可能导致 Cloud Shell 与本地计算机上的范围不同?如何修复它,以便我可以在本地正确访问 Artifact Registry?

编辑

为了澄清,这里是我正在运行的命令和我看到的错误,它与上面引用的 SO 问题完全相同。命令直接取自 [Artifact Registry Quickstart] ( https://cloud.google.com/artifact-registry/docs/docker/quickstart#gcloud )。这个问题本来是关于范围的,但似乎这些可能不是我的问题。

$ gcloud auth configure-docker us-central1-docker.pkg.dev
WARNING: Your config file at [~/.docker/config.json] contains these credential helper entries:

{
  "credHelpers": {
    "gcr.io": "gcloud",
    "us.gcr.io": "gcloud",
    "eu.gcr.io": "gcloud",
    "asia.gcr.io": "gcloud",
    "staging-k8s.gcr.io": "gcloud",
    "marketplace.gcr.io": "gcloud",
    "us-central1-docker.pkg.dev": "gcloud"
  }
}
Adding credentials for: us-central1-docker.pkg.dev
gcloud credential helpers already registered correctly.


$ sudo docker tag us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 \
us-central1-docker.pkg.dev/<my project>/quickstart-docker-repo/quickstart-image:tag1

$ sudo docker push us-central1-docker.pkg.dev/<my project>/quickstart-docker-repo/quickstart-image:tag1              
The push refers to repository [us-central1-docker.pkg.dev/<my project>/quickstart-docker-repo/quickstart-image]
260c3e3f1e70: Preparing 
e2eb06d8af82: Preparing 
denied: Permission "artifactregistry.repositories.downloadArtifacts" denied on resource "projects/qwanto/locations/us-central1/repositories/quickstart-docker-repo" (or it may not exist)
4

2 回答 2

2

无论如何,这里的范围是什么?它们与分配给项目负责人 (example@stackoverflow.com) 的角色有什么关系?

在 Google Cloud 中,身份的权限由 Google Cloud IAM 角色确定。这是一个重要的理解点。

请求授权时使用 OAuth 范围。范围可以将授予的权限限制为 IAM 角色授予的权限子集。范围不能授予超出 IAM 角色或不包括在 IAM 角色中的权限。

将生成的权限视为 IAM 角色和 OAuth 范围的交集

注意:您的范围https://www.googleapis.com/auth/cloud-platform就足够了。其他范围只是额外的。忽略范围并确保您的 IAM 角色正确。

什么可能导致 Cloud Shell 与本地计算机上的范围不同?如何修复它,以便我可以在本地正确访问 Artifact Registry?

您在解决问题时追求错误的细节(范围)。如果您已为您的身份授予正确的 IAM 角色,您就可以推送到 Container Registry 和 Artifact Registry。

于 2021-09-16T23:54:03.457 回答
0

大概在同一个问题中运行,我发现解决方案有些隐藏在文档中(在链接部分的末尾):

注意:如果您通常使用 sudo 在 Linux 上运行 Docker 命令,Docker 会在 /root/.docker/config.json 而不是 $HOME/.docker/config.json 中查找 Artifact Registry 凭据。如果您想将 sudo 与 docker 命令一起使用,而不是使用 Docker 安全组,请改为使用 sudo gcloud auth configure-docker 配置凭据。

所以基本上,快速入门只有在你不sudo用于运行 docker 时才有效。

于 2022-01-02T16:43:33.370 回答