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

如何在Cloud Run构建阶段访问私有Git仓库

Python Cloud Run 构建阶段拉取私有Git依赖最佳实践

因为你的依赖拉取发生在镜像构建阶段,不需要Cloud Run运行时持有Git访问权限,只需要在构建镜像的环节(通常是Cloud Build)配置私有仓库访问权限即可,以下是两种可落地的方案:

方案1:个人访问令牌(PAT)快速配置

  • 第一步:在你的Git托管平台生成仅拥有目标私有仓库只读权限的PAT,不要授予额外权限
  • 第二步:将PAT上传至Google Secret Manager,命名为GIT_PRIVATE_REPO_PAT,同时给Cloud Build默认服务账号(格式为[项目号]@cloudbuild.gserviceaccount.com)授予Secret Manager 秘密访问者角色
  • 第三步:修改requirements.txt中私有依赖的声明格式,示例如下:
# 原有格式
# git+https://github.com/你的账号/私有仓库名.git@v1.0.0#egg=my_private_package
# 替换为带令牌变量的格式
git+https://${GIT_PAT}@github.com/你的账号/私有仓库名.git@v1.0.0#egg=my_private_package
  • 第四步:编写cloudbuild.yaml,在构建阶段注入Secret作为环境变量再执行依赖安装,示例:
steps:
  # 拉取Secret存入临时文件
  - name: 'gcr.io/cloud-builders/gcloud'
    entrypoint: 'bash'
    args:
      - '-c'
      - |
        gcloud secrets versions access latest --secret=GIT_PRIVATE_REPO_PAT > /workspace/git_pat.txt
  # 构建镜像,传入PAT作为构建参数
  - name: 'gcr.io/cloud-builders/docker'
    args:
      - 'build'
      - '--build-arg'
      - 'GIT_PAT=$(cat /workspace/git_pat.txt)'
      - '-t'
      - 'us-central1-docker.pkg.dev/你的项目ID/镜像仓库名/镜像名:latest'
      - '.'
# 推送镜像到制品仓库
images:
  - 'us-central1-docker.pkg.dev/你的项目ID/镜像仓库名/镜像名:latest'
  • 第五步:在你的Dockerfile中接收构建参数,注意不要把PAT留存到镜像层,示例Dockerfile片段:
# 接收构建时传入的PAT
ARG GIT_PAT
# 安装依赖,构建完成后该变量不会留存到最终镜像
RUN pip install -r requirements.txt

方案2:SSH部署密钥(更安全,适合生产环境)

  • 第一步:生成SSH密钥对,将公钥添加到私有仓库的部署密钥列表,仅开启只读权限
  • 第二步:将私钥内容上传到Google Secret Manager,命名为GIT_REPO_SSH_KEY,同样给Cloud Build默认服务账号授予Secret Manager 秘密访问者角色
  • 第三步:修改requirements.txt中私有依赖为SSH格式,示例:
git+ssh://git@github.com/你的账号/私有仓库名.git@v1.0.0#egg=my_private_package
  • 第四步:编写cloudbuild.yaml,构建时临时配置SSH访问权限,示例:
steps:
  - name: 'gcr.io/cloud-builders/gcloud'
    entrypoint: 'bash'
    args:
      - '-c'
      - |
        # 拉取SSH私钥
        gcloud secrets versions access latest --secret=GIT_REPO_SSH_KEY > /workspace/id_rsa
        chmod 600 /workspace/id_rsa
        # 构建镜像时传入私钥
        docker build --secret id=ssh_key,src=/workspace/id_rsa -t us-central1-docker.pkg.dev/你的项目ID/镜像仓库名/镜像名:latest .
images:
  - 'us-central1-docker.pkg.dev/你的项目ID/镜像仓库名/镜像名:latest'
  • 第五步:Dockerfile中使用Docker构建密钥临时加载SSH私钥,不会留存到镜像层,示例片段:
# 安装openssh-client用于SSH访问
RUN apt-get update && apt-get install -y --no-install-recommends openssh-client && rm -rf /var/lib/apt/lists/*
# 配置Git托管平台信任列表
RUN mkdir -p -m 0700 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts
# 临时加载SSH密钥安装依赖,不会写入镜像层
RUN --mount=type=secret,id=ssh_key,dst=/root/.ssh/id_rsa \
    chmod 600 /root/.ssh/id_rsa && \
    pip install -r requirements.txt

核心注意事项

  • 两种方案的密钥都仅在构建阶段临时存在,不会写入最终的Cloud Run镜像,不存在密钥泄露风险
  • 依赖安装完成后所有依赖包都已经打包到镜像内,Cloud Run运行时不需要任何Git相关的访问权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 18:27:01