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

通过Dockerfile与Google Cloud Secret Manager构建时生成凭据文件

从Secret Manager获取凭据在Cloud Build构建Django镜像时实现认证

一、修复你现有方案的问题

你之前的尝试失败,核心是没有在Cloud Build的Docker构建命令中把Secret Manager的凭据传递给Docker构建参数,同时Dockerfile里的凭据写入方式可能导致格式错误。

修正后的cloudbuild.yaml

steps:
  - name: gcr.io/cloud-builders/docker
    args:
      - build
      - '--no-cache'
      - '-t'
      - '$_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA'
      - .
      - '-f'
      - Dockerfile
      - '--build-arg'
      - 'GOOGLE_BUILD_CREDS=$$CREDENTIALS'  # 用$$转义,将Secret Manager的CREDENTIALS变量传给构建参数
    id: Build
availableSecrets:
  secretManager:
  - versionName: projects/PROJECT_ID/secrets/CREDENTIALS/versions/latest
    env: 'CREDENTIALS'

修正后的Dockerfile

# 必须在使用构建参数前声明ARG
ARG GOOGLE_BUILD_CREDS

# 用printf写入凭据,避免echo自动添加换行破坏JSON格式
RUN printf "%s" "$GOOGLE_BUILD_CREDS" > /app/credentials.json

# 设置认证环境变量
ENV GOOGLE_APPLICATION_CREDENTIALS=/app/credentials.json

# 执行需要认证的操作(比如收集静态文件)
RUN python manage.py collectstatic --noinput

关键注意事项

  • Cloud Build中用$$转义$,否则单个$CREDENTIALS会被Cloud Build解析为自身的环境变量,无法传递给Docker。
  • 使用printf而非echo写入凭据,防止多余换行导致JSON格式错误(认证失败的常见原因)。
  • ARG必须声明在引用它的RUN命令之前,否则构建参数无法被识别。

二、更优方案:无需在镜像中存储凭据

上面的方案会把凭据写入镜像,存在安全风险。更推荐的做法是在Cloud Build步骤中直接执行需要认证的操作(如collectstatic),而非在Docker构建阶段,这样镜像里不会包含任何凭据:

优化后的cloudbuild.yaml

steps:
  # 1. 安装Python依赖
  - name: python:3.11
    entrypoint: pip
    args: ["install", "-r", "requirements.txt", "--user"]

  # 2. 执行collectstatic,直接使用Secret Manager的凭据
  - name: python:3.11
    entrypoint: python
    args: ["manage.py", "collectstatic", "--noinput"]
    env:
      - 'GOOGLE_APPLICATION_CREDENTIALS=/workspace/credentials.json'
    volumes:
      - name: 'creds'
        path: '/workspace/credentials.json'

  # 3. 构建Docker镜像(此时静态文件已处理完成,镜像无需凭据)
  - name: gcr.io/cloud-builders/docker
    args:
      - build
      - '--no-cache'
      - '-t'
      - '$_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA'
      - .
      - '-f'
      - Dockerfile
    id: Build

# 挂载Secret Manager的凭据到Cloud Build步骤
availableSecrets:
  secretManager:
  - versionName: projects/PROJECT_ID/secrets/CREDENTIALS/versions/latest
    secret: 'CREDENTIALS'
volumes:
  - name: 'creds'
    secret:
      secretName: 'CREDENTIALS'

方案优势

  • 凭据仅在Cloud Build执行过程中临时挂载,不会被写入Docker镜像。
  • 静态文件的收集操作和镜像构建分离,逻辑更清晰,镜像体积更小。

额外建议

如果你的Cloud Build默认服务账号(格式为PROJECT_NUMBER@cloudbuild.gserviceaccount.com)已经拥有GCS存储桶的访问权限(如Storage Object Admin角色),甚至可以完全不需要单独的凭据文件:直接在Cloud Build步骤中执行collectstatic,Cloud Build会自动使用自身服务账号的权限完成认证,无需从Secret Manager读取凭据。

内容的提问来源于stack exchange,提问作者tomma-d

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 23:45:54