不可变制品是什么
不可变制品原则指制品一经发布,内容、标签、校验和都不再修改,修复问题只能发新版本。这样引用与内容一一对应:回滚、审计比对、供应链校验才有可信基准。实现上依靠仓库的 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 从测试晋级生产;重新构建会引入依赖解析、时间戳等差异。
开启标签不可变前先演练:禁止重推后,历史流水线里的重推步骤会直接失败,先在测试仓库验证改造范围。