gcloud auth的访问范围是什么?为何Cloud Shell与本地机器存在差异
问题1:scope定义和与IAM角色的关联
- OAuth scope是Google OAuth2访问令牌的访问范围限制标识,用于指定该令牌允许调用哪些类别的Google API,是令牌层面的权限边界。
- 它和IAM角色是双重校验关系:操作需要同时满足两个条件才能成功:
- 你使用的访问令牌的scope包含对应服务的API访问权限(比如Artifact Registry的操作只要包含
https://www.googleapis.com/auth/cloud-platform就已满足) - 你登录的账号本身被分配了对应资源的IAM角色权限,角色是账号层面的权限边界。
你的本地令牌已经包含了cloud-platform全量scope,所以scope不足并不是你本次报错的原因。
- 你使用的访问令牌的scope包含对应服务的API访问权限(比如Artifact Registry的操作只要包含
问题2:Cloud Shell与本地scope差异原因,以及本地访问Artifact Registry的解决方案
scope差异原因
Cloud Shell作为Google官方托管的云终端,默认登录时会自动申请覆盖所有常用GCP服务的scope,而本地执行gcloud auth login时默认仅申请基础的常用scope,因此两者的scope列表长度有差异,但你的本地scope已经包含访问Artifact Registry所需的范围,所以无需调整scope。
你本次报错的真实原因
你使用了sudo执行docker push命令:
你执行gcloud auth configure-docker时用的是当前普通用户,凭证配置写入了当前用户的~/.docker/config.json,而加sudo运行docker时,系统会切换到root用户执行命令,读取的是root用户家目录下的/.docker/config.json,不存在你配置的gcloud凭证助手,因此认证失败触发权限报错。
解决方案(任选其一即可)
- 【推荐】将当前用户加入docker用户组,后续无需加sudo执行docker命令:
# 把当前用户加入docker组 sudo usermod -aG docker $USER # 执行后退出当前终端重新登录,再直接执行push命令即可 docker push us-central1-docker.pkg.dev/<你的项目ID>/quickstart-docker-repo/quickstart-image:tag1
- 给root用户也配置docker凭证助手:
sudo gcloud auth configure-docker us-central1-docker.pkg.dev sudo docker push us-central1-docker.pkg.dev/<你的项目ID>/quickstart-docker-repo/quickstart-image:tag1
- 执行sudo时指定HOME目录为当前用户的家目录:
sudo HOME=$HOME docker push us-central1-docker.pkg.dev/<你的项目ID>/quickstart-docker-repo/quickstart-image:tag1
权限验证方法
如果修改后还是报错,可以先执行以下命令验证账号本身的权限是否正常:
gcloud artifacts repositories list --location=us-central1
如果该命令能正常返回仓库列表,说明账号IAM权限没有问题,问题依然出在docker的凭证配置环节;如果该命令也报错,才需要检查对应账号是否被分配了roles/artifactregistry.writer之类的对应角色。
内容的提问来源于stack exchange,提问作者Sasgorilla
相关产品推荐
相关产品推荐

