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
相关产品推荐
相关产品推荐

