首页/开发/CI/CD 与发布速查/构建与环境配置分离
环境与配置管理60 条

构建与环境配置分离

制品不携带环境配置:同一镜像部署到所有环境,环境差异在运行时注入;构建期需要凭据时用挂载而非固化。

CI/CD 与发布速查开发更新于 2026-10-13

构建与环境配置分离是什么

构建与环境配置分离(12-Factor 的 build/release/run 分离)指:制品不携带环境配置,同一镜像部署到所有环境,环境差异在运行时注入。这样一次构建可以被验证、被晋级、被回滚——回滚的就是那个已经验证过的制品,而不是重新构建一个「应该一样」的新产物。构建期确实需要凭据的场景(私有包源令牌、签名密钥)用挂载临时注入而不是固化进层;运行期配置用环境变量、挂载文件或密钥管理注入,改配置不需要重新构建。

基本信息

原则镜像/包与配置分离(12-Factor 基础)
构建期凭据BuildKit secret 挂载、npm/pip 私有源令牌临时注入
运行期环境变量/挂载文件/密钥管理注入,变更无需重构建
典型例外前端构建期变量,需要运行时配置能力

典型使用场景

  • 一次构建多环境:同一制品从测试一路晋级到生产,制品本身不变。
  • 回滚一致性:回滚指向已验证的旧制品,不需要重建。
  • 构建缓存复用:配置差异不影响构建缓存命中。
  • 安全合规:镜像历史里没有密钥,构建日志也不出现明文。
  • 前端运行时配置:搭一个 config.js 或配置接口,替代按环境重新构建。

反例与正例

反例与正例
# 反例:构建时把 API_URL 写进产物
#   VITE_API_URL=https://prod.example.com npm run build
# 正例:同一产物,运行时注入(前端可通过运行时配置接口)
# 后端: 环境变量/挂载文件在启动时读取
# 构建期私有源: BuildKit secret 挂载(--mount=type=secret)

阶段对照

阶段输入说明
build源码+依赖产出可复现制品
release制品+配置模板组合为发布单元
run环境特定配置进程启动时注入
前端构建期变量是常见例外:需要运行时配置能力(config.js/接口下发)才能保持一次构建,否则又退回到按环境重建。
构建期凭据不要用 build-arg:参数会留在镜像元数据里,用 BuildKit secret 挂载,仅指定层可见。

易错点

  • 每环境各构建一次:制品漂移且验证失效,推动运行时注入改造。
  • 构建参数里带密钥:留在镜像历史里,secret 挂载替代。
  • 运行时配置只在启动读一次:变更要重启才生效,把重启或热加载机制设计进流程。
  • 前端配置进镜像又想运行时改:用挂载覆盖或独立配置服务,不要按环境重新打包。
  • 配置注入点过多:多套注入方式并存导致排查混乱,统一入口并文档化。

数据来源与参考

  • 12factor.net《Build, release, run》
  • Docker Docs《Build secrets》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌