GCP Cloud Build权限错误:调用者无权限或资源不存在
解决Cloud Build推送镜像到Artifact Registry的权限问题
我正尝试将单体仓库(monorepo)中的NestJS应用通过GCP Cloud Build API部署,目前已能成功构建镜像,但推送至Artifact Registry时失败,收到**"Caller does not have permission or the resource may not exist"**错误。
我的cloudbuild.yaml内容如下:
steps: - name: 'gcr.io/cloud-builder/docker' args: [ 'build', '-t', 'europe-west1-docker.pkg.dev/driven-atrium-414021/reservations/production', '-f', 'apps/reservations/Dockerfile', '.', ] - name: 'gcr.io/cloud-builder/docker' args: [ 'push', 'europe-west1-docker.pkg.dev/driven-atrium-414021/reservations/production', ] - name: 'gcr.io/cloud-builder/docker' args: [ 'build', '-t', 'europe-west1-docker.pkg.dev/driven-atrium-414021/auth/production', '-f', 'apps/auth/Dockerfile', '.', ] - name: 'gcr.io/cloud-builder/docker' args: [ 'push', 'europe-west1-docker.pkg.dev/driven-atrium-414021/auth/production', ] - name: 'gcr.io/cloud-builder/docker' args: [ 'build', '-t', 'europe-west1-docker.pkg.dev/driven-atrium-414021/notifications/production', '-f', 'apps/notifications/Dockerfile', '.', ] - name: 'gcr.io/cloud-builder/docker' args: [ 'push', 'europe-west1-docker.pkg.dev/driven-atrium-414021/notifications/production', ] - name: 'gcr.io/cloud-builder/docker' args: [ 'build', '-t', 'europe-west1-docker.pkg.dev/driven-atrium-414021/payments/production', '-f', 'apps/payments/Dockerfile', '.', ] - name: 'gcr.io/cloud-builder/docker' args: [ 'push', 'europe-west1-docker.pkg.dev/driven-atrium-414021/payments/production', ]
已执行过gcloud auth configure-docker gcr.io命令,且我的账号拥有管理员/所有者角色,Artifact Registry中的目标仓库也已确认存在,但问题仍未解决。
排查与解决方案
1. 检查Cloud Build服务账号权限
Cloud Build默认使用[PROJECT_NUMBER]@cloudbuild.gserviceaccount.com服务账号执行构建,而非你本地的用户账号,这是新手常忽略的点。需为该账号添加Artifact Registry权限:
- 进入GCP控制台的IAM与管理员页面
- 搜索并定位Cloud Build服务账号
- 添加以下角色之一:
Artifact Registry Writer:仅镜像推送权限,遵循最小权限原则Artifact Registry Administrator:全权限,适合快速测试
2. 补充配置Artifact Registry域名的Docker认证
你推送的仓库域名为europe-west1-docker.pkg.dev,但仅执行了gcr.io的配置,需补充执行:
gcloud auth configure-docker europe-west1-docker.pkg.dev
3. 核对仓库地址的准确性
确认cloudbuild.yaml中的仓库地址与Artifact Registry实际配置完全一致:
- 地域是否为
europe-west1 - 仓库名称(reservations、auth等)是否与控制台创建的一致
- 镜像标签(production)是否符合Artifact Registry命名规则
4. 本地手动测试推送
在本地环境执行推送命令,验证是否能正常推送:
docker push europe-west1-docker.pkg.dev/driven-atrium-414021/reservations/production
若本地能推送,说明问题出在Cloud Build服务账号权限;若本地也失败,检查本地Docker认证配置或网络连接。
内容的提问来源于stack exchange,提问作者salouri
相关产品推荐
相关产品推荐

