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

Google Cloud Build构建Python应用时无法从私有Artifact Registry拉取依赖

解决方案:无需服务账号JSON在Cloud Build中拉取Artifact Registry私有Python包

方法一:利用Cloud Build短期访问令牌(推荐,无持久密钥)

步骤1:给Cloud Build默认服务账号授予Artifact Registry读取权限

Cloud Build运行时使用默认服务账号[你的项目编号]@cloudbuild.gserviceaccount.com,需要给它添加Artifact Registry Reader角色:

  • 打开Google Cloud控制台的Artifact Registry页面,找到私有仓库hive-commons-art-repo
  • 进入仓库「权限」设置,添加上述服务账号,分配roles/artifactregistry.reader角色

步骤2:修改Cloud Build配置生成并传递短期令牌

更新cloudbuild-preview.yaml,先生成Artifact Registry短期访问令牌,再传递给Docker构建:

steps:
  - id: "生成Artifact Registry访问令牌"
    name: "gcr.io/cloud-builders/gcloud"
    args: ["auth", "print-access-token"]
    outputs:
      - path: /workspace/artifact-token
  - id: "构建Docker镜像"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "build",
        "-t",
        "gcr.io/${PROJECT_ID}/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
        ".",
        "--target",
        "staging",
        "--no-cache",
        "--build-arg", "ARTIFACT_REGISTRY_TOKEN=$(cat /workspace/artifact-token)"
      ]

步骤3:修改Dockerfile使用令牌认证pip

在staging阶段,用构建参数中的令牌直接构造带认证的索引地址,无需依赖密钥管理插件:

FROM base as staging

ENV DB_NAME=hive-staging
# 接收构建时传入的令牌参数
ARG ARTIFACT_REGISTRY_TOKEN

RUN pip install --upgrade pip
# 用令牌替换认证信息,直接拉取私有包
RUN pip install --no-cache-dir \
  --index-url https://oauth2accesstoken:${ARTIFACT_REGISTRY_TOKEN}@europe-west1-python.pkg.dev/hive-347910/hive-commons-art-repo/simple \
  --extra-index-url https://pypi.org/simple \
  -r requirements.txt

CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 "hive:create_app()"

注意:可保留requirements.txt中的--extra-index-url,建议去掉--index-url避免重复配置。

方法二:使用Cloud Secret Manager托管服务账号密钥(适用于复杂场景)

如果需要保留keyrings.google-artifactregistry-auth插件的使用,可将服务账号JSON存储在Secret Manager中,构建时临时挂载:

步骤1:将服务账号JSON存入Secret Manager

  • 创建具有Artifact Registry Reader权限的服务账号,生成JSON密钥
  • 在Secret Manager中创建名为cloudbuild-artifact-registry-sa的密钥,上传JSON文件

步骤2:修改Cloud Build配置挂载密钥

更新cloudbuild-preview.yaml,引入Secret Manager的密钥并挂载到Docker构建容器:

steps:
  - id: "构建Docker镜像"
    name: "gcr.io/cloud-builders/docker"
    args:
      [
        "build",
        "-t",
        "gcr.io/${PROJECT_ID}/${_SERVICE_NAME}:${_PR_NUMBER}-${SHORT_SHA}",
        ".",
        "--target",
        "staging",
        "--no-cache",
        "--build-arg", "GOOGLE_APPLICATION_CREDENTIALS=/tmp/sa.json",
        "--mount", "type=secret,id=artifact-registry-sa,target=/tmp/sa.json"
      ]
availableSecrets:
  secretManager:
    - versionName: projects/${PROJECT_ID}/secrets/cloudbuild-artifact-registry-sa/versions/latest
      id: artifact-registry-sa

步骤3:调整Dockerfile配置环境变量

保持原有的keyrings.google-artifactregistry-auth安装,利用挂载的密钥文件完成认证:

FROM base as staging

ENV DB_NAME=hive-staging
ARG GOOGLE_APPLICATION_CREDENTIALS
ENV GOOGLE_APPLICATION_CREDENTIALS=${GOOGLE_APPLICATION_CREDENTIALS}

RUN pip install --upgrade pip
RUN pip install keyrings.google-artifactregistry-auth 
RUN pip install --no-cache-dir -r requirements.txt

CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 "hive:create_app()"

关键注意事项

  • 多阶段构建隔离凭据:无论使用哪种方法,确保最终运行镜像不包含构建阶段的凭据(比如从base阶段重新构建,或仅复制staging阶段的应用文件到新的运行阶段)
  • 令牌过期机制:方法一的短期令牌默认有效期1小时,足够Cloud Build完成构建,无需手动刷新
  • 权限最小化:给Cloud Build服务账号或自定义服务账号仅分配Artifact Registry Reader权限,避免过度授权

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 22:55:17