容器镜像标签(Tag)使用规范
2022年5月19日大约 4 分钟
容器镜像标签(Tag)使用规范
分享一篇自己写的镜像标签使用规范,提高镜像的可靠性和可维护性。
目的
该文档定义了为容器镜像创建版本控制标签(Tag)的最佳实践和规范,以帮助开发、测试和运维团队更好地跟踪和管理容器镜像版本。
基本原则
- 清晰: Tag 应清晰地反映其对应的镜像版本和用途。
- 一致: 整个项目或组织中的镜像应使用统一的命名规范。
- 可追溯: 应能通过 Tag 轻松找到对应的源代码提交或构建。
部署要求
- 现网环境必须使用 语义化版本 ,保证镜像仓库内镜像的可靠性。
- 预发布环境应当使用 语义化版本 进行上线前的最后验证、如果特殊情况的应用无法使用语义化版本,可使用 环境特定版本 。
- 测试环境为保证正常的测试进度也需要镜像持久化,只要求有 tag (不使用镜像的 sha256 值部署)。
- 开发环境不要求,开发人员可自行替换镜像验证代码,提高开发效率。
Tag 常见例子
- 最新版本: 使用 latest Tag 指向最新稳定版本的镜像。但要注意,latest 不应被用在生产环境,因为它的不确定性可能会引发问题。
- 语义化版本: 对于发布的每个版本,都应使用语义化版本命名,如 1.0.0、1.0.1、1.1.0 等。这有助于理解版本之间的关系和兼容性。具体参阅 语义化版本 2.0.0
- 环境特定版本: 如果镜像是为特定环境(如测试、生产)定制的,可以在 Tag 中包含该环境,如 1.2.3-staging,1.2.3-sit,1.2.3-pre。
- 构建版本: 对于每次构建,可以使用构建编号或源代码的提交哈希(或部分哈希)作为 Tag,如 build-1234 或 commit-a1b2c3d。
- 开发版本: 对于 beta、alpha 或开发中的版本,可以在语义化版本后添加预发布标签,如 1.2.0-beta 或 1.2.0-alpha,或无 tag 的镜像 (sha256值)。
nginx 镜像 tag 示例

现网 tag X.Y.Z 语义化版本号增加规范
- 主版本(X),以下情况,主版本+1
- 产品线或业务线当进行大量不兼容的更改,包括接口名、传参、返回结果等。
- 架构或核心部分进行了大的重构或者重写。往往所有涉及到架构或公共组件的应用全体都会通知一起增加版本号。
- 次版本(Y),以下情况,次版本+1
- 当应用添加新功能,新接口,如常规需求升级,定期版本升级,是常见的升级情况。
- 补丁版本(Z),以下情况,补丁版本+1
- 功能缺陷修复,现网有问题的代码,即使上线后产生其他问题,需要再次出镜像,也要增加版本号。
- 代码性能优化,但没有修改任何数据模型字段,如 SQL 查询优化,线程执行调整。
- 安全性修复,这些修复并不改变功能,但修复了应用中的潜在安全风险。
- 代码清理,移除冗余代码或者减少依赖,减轻镜像大小。
现网 tag 使用规范
现网生产环境不要使用没有 tag 的镜像(直接使用镜像的 sha256 值):
- 没有语义,会降低交付时沟通及核对效率。批量/汇总比对、统计、校验会变得更加不易处理。
- 部署工具如 Argo CD 虽然有使用 sha256 值的记录,但没有数据持久化,数据不可靠,如果重启数据将丢失,无法快速回滚。
- 在镜像仓库内不可靠,没有 tag 的镜像不保证不会被清理,常见原因:时间周期固定的计划性清理,或者仓库存储空间不够紧急自动触发的清理。这样会使得现网个别应用无法回滚到指定版本。
现网生产环境应当使用语义化的 tag ,并且遵循以下细则:
- 不能删除镜像的 tag ,迁移重新调度的 pod,新增副本的 pod ,包括回滚时,K8s 基于 tag 无法找到镜像仓库的镜像。
- 不能覆盖镜像已有的 tag,如果需要修复旧版本的问题,应发布一个新的补丁版本。同样的 tag 不同的内容不允许发布到现网。