首页/开发/CI/CD 与发布速查/不可变制品原则
构建与制品管理58 条

不可变制品原则

制品一经发布即冻结:内容、标签、校验和不再修改,修复通过发布新版本完成。

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

不可变制品是什么

不可变制品原则指制品一经发布,内容、标签、校验和都不再修改,修复问题只能发新版本。这样引用与内容一一对应:回滚、审计比对、供应链校验才有可信基准。实现上依靠仓库的 immutability 设置(禁止标签重推)、以 digest 引用、必要时 WORM 存储;配套纪律是构建一次、处处晋升,而不是每个环境重新构建。

基本信息

含义已发布制品的任何字节不再变化
载体仓库 immutability 设置、禁止重推标签、WORM 存储策略
引用方式以 digest(如 sha256:…)为准,标签只是人类可读别名
收益回滚与审计可信:引用即确定内容
对立面标签被覆盖、制品被替换:回滚可能退回错误字节,审计失去基准

标签与摘要对比

引用稳定性用途
标签 app:1.8.0可被重推,内容可变开发与调试场景
摘要 app@sha256:…内容寻址,不可变生产部署与审计

典型使用场景

  • 回滚按 digest 部署:退回去的字节与当初发布完全一致
  • 审计与合规:证明线上运行的正是审计通过的那份制品
  • 多环境晋升:staging 验证过的 digest 原样晋升生产,不重新构建
  • 供应链校验:签名与 SBOM 绑定 digest 归档,部署时按 digest 核验
  • 事故取证:比对线上 digest 与仓库记录,判断制品是否被替换过

验证不可变性

验证不可变性
# 查镜像摘要(digest 才是内容的唯一标识)
docker manifest inspect registry.example.com/app:1.8.0 | grep -i digest

# 发布记录同时保存标签与摘要
# RELEASE: app:1.8.0 -> sha256:3f2a...

# 部署按摘要引用,杜绝浮动标签
# image: registry.example.com/app@sha256:3f2a...
允许覆盖已发布标签的仓库等于允许静默换货:审计与回滚都失去基准。
构建一次、处处部署:同一 digest 从测试晋级生产;重新构建会引入依赖解析、时间戳等差异。
开启标签不可变前先演练:禁止重推后,历史流水线里的重推步骤会直接失败,先在测试仓库验证改造范围。

易错点

  • 为修小问题覆盖同一版本制品:环境间内容不一致且不可复现,先升版本号
  • 只在 CI 侧约束不可变、仓库不设防:人工操作仍可覆盖,要设置仓库级保护
  • 标签重推后无人察觉:上线内容与评审内容不一致,开启标签不可变并对重推告警
  • 发布记录只存标签不存 digest:事后无法证明线上内容,记录必须成对保存

数据来源与参考

  • Humble & Farley《Continuous Delivery》
  • Docker Docs《Registry》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌