从GCE实例拉取Artifact Registry镜像遭认证拒绝,求解决方案
解决GCE虚拟机拉取GCR镜像的未认证问题
假设你已经为GCE实例关联的服务账号添加了Artifact Registry Reader(旧版GCR对应Storage Object Viewer)权限,除此之外还需要完成以下操作:
1. 检查GCE实例的云API访问范围
- 登录GCP控制台,找到目标GCE实例并进入编辑页面
- 滚动到云API访问范围区域,确认Cloud Storage(或Artifact Registry)的访问范围设置为只读或完全,不能是禁用状态
- 修改完成后重启实例使设置生效
2. 利用实例元数据获取凭证登录Docker
在GCE实例上无需使用本地的gcloud auth命令,直接通过实例内置的元数据服务获取服务账号凭证:
curl -s "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google" | jq -r '.access_token' | docker login -u oauth2accesstoken --password-stdin https://europe-west1-docker.pkg.dev
如果实例未安装jq,可改用awk解析:
curl -s "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google" | awk -F'"' '{print $4}' | docker login -u oauth2accesstoken --password-stdin https://europe-west1-docker.pkg.dev
3. 验证服务账号权限与身份
在实例上执行以下命令确认当前活跃账号为实例绑定的服务账号:
gcloud auth list
输出的活跃账号格式应为[实例服务账号名]@[项目ID].iam.gserviceaccount.com,随后测试权限是否生效:
gcloud artifacts repositories list --project=<你的项目ID> --location=europe-west1
若能正常列出仓库,说明权限已正确配置。
4. 确认镜像拉取地址的完整性
拉取镜像时必须使用控制台显示的完整地址,格式如下:
docker pull europe-west1-docker.pkg.dev/<你的项目ID>/<仓库名>/<镜像名>:latest
确保项目ID、仓库名、镜像名均无遗漏或拼写错误。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

