You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在GCloud Kubernetes执行器的GitLab Runner中docker push到Artifact Registry权限报错

解决GitLab Runner Kubernetes执行器Docker Push到Artifact Registry的权限问题

排查与解决步骤

1. 确认服务账号的权限绑定是否生效

首先检查ci-service-account是否被正确赋予了镜像上传权限:

  • 执行命令完成权限绑定(未正确绑定的话):
    gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
      --member "serviceAccount:ci-service-account@YOUR_PROJECT_ID.iam.gserviceaccount.com" \
      --role "roles/artifactregistry.writer"
    
  • 验证绑定是否成功:
    gcloud projects get-iam-policy YOUR_PROJECT_ID --filter="bindings.members:ci-service-account" --format="value(bindings.role)"
    
    输出必须包含roles/artifactregistry.writer;如果用自定义角色,要确保角色包含artifactregistry.repositories.uploadArtifacts权限。
  • 若目标仓库是区域级,也可以给单个仓库精准绑定权限:
    gcloud artifacts repositories add-iam-policy-binding YOUR_REPO_NAME \
      --location europe \
      --member "serviceAccount:ci-service-account@YOUR_PROJECT_ID.iam.gserviceaccount.com" \
      --role "roles/artifactregistry.writer"
    

2. 确保GitLab Runner Pod确实使用了指定的服务账号

很多时候问题出在Runner没真正用上你指定的服务账号:

  • 查看当前运行的Runner Pod使用的服务账号:
    kubectl get pods -n YOUR_RUNNER_NAMESPACE -o jsonpath='{.items[*].spec.serviceAccountName}'
    
  • 若输出不是ci-service-account,检查以下两点:
    1. 自托管Runner的config.toml中,[[runners.kubernetes]]段是否硬编码了service_account值,如果有,要么删除该配置,要么改为ci-service-account;
    2. KUBERNETES_SERVICE_ACCOUNT_OVERWRITE变量要在GitLab项目/组的CI变量中设置,不能只写在.gitlab-ci.yml里(共享Runner可能需要在实例级配置)。

3. 简化Docker认证流程(无需手动安装gcloud SDK)

你之前手动安装gcloud的步骤没必要,直接利用Kubernetes服务账号的凭据完成Docker登录:
修改.gitlab-ci.yml的script部分:

script:
  - docker build -t imagename:${TAG} job/
  - docker tag imagename:${TAG} europe-docker.pkg.dev/project/repository/imagename:${TAG}
  # 用服务账号凭据登录Artifact Registry
  - echo "$GOOGLE_APPLICATION_CREDENTIALS" > /tmp/service-account-key.json
  - docker login -u _json_key -p "$(cat /tmp/service-account-key.json)" europe-docker.pkg.dev
  - docker push europe-docker.pkg.dev/project/repository/imagename:${TAG}
  • 注意:如果集群启用了工作负载身份,GOOGLE_APPLICATION_CREDENTIALS会自动注入Pod;如果没启用,需要手动创建服务账号密钥,把密钥的JSON内容作为GitLab CI变量GOOGLE_APPLICATION_CREDENTIALS传入。

4. 检查Artifact Registry仓库的直接权限

进入GCP控制台的Artifact Registry页面,找到目标仓库,查看「权限」标签,确认ci-service-account确实在列表中,且角色为Artifact Registry Writer或包含上传权限的自定义角色。

额外验证点

  • 核对Docker镜像标签的仓库地址(europe-docker.pkg.dev/project/repository),确保没有拼写错误;
  • 如果用工作负载身份,确认完成了身份绑定:
    gcloud iam service-accounts add-iam-policy-binding ci-service-account@YOUR_PROJECT_ID.iam.gserviceaccount.com \
      --member "serviceAccount:YOUR_K8S_PROJECT.svc.id.goog[YOUR_RUNNER_NAMESPACE/ci-service-account]" \
      --role "roles/iam.workloadIdentityUser"
    

内容的提问来源于stack exchange,提问作者Shadesfear

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 15:39:23