3. 镜像版本管理:标签规范、语义化版本与仓库清理

镜像版本管理这事儿,说简单也简单,说复杂能让你头大。我见过太多团队,一开始随便打个 latest 标签就上线了,结果三个月后,谁都不知道线上跑的是哪个版本。嗯,今天咱们就把这块彻底聊透。

3.1 镜像标签规范——别让名字变成灾难

先说说标签。我个人习惯,标签就是镜像的身份证。你想想看,如果身份证上只写了个「张三」,那跟没写有啥区别?

我建议的标签格式是这样的:

<项目名>-<主版本>.<次版本>.<修订号>-<构建号>

举个例子:

user-service-2.1.3-b20240315
payment-api-1.0.0-b20240314
gateway-3.2.1-b20240313

为什么要这么搞?我在项目中遇到过,有次线上出了 bug,运维小哥对着十几个 latest 标签的镜像,完全不知道哪个才是生产环境在用的。最后只能一个个拉下来跑一遍,折腾了整整半天。

核心原则: 标签必须能唯一标识一个镜像,并且能让人一眼看出它的版本和构建时间。

这里有几个避坑指南:

  • 别用 latest 作为生产标签——它应该只用于开发环境
  • 别用时间戳作为唯一标识——同一时间可能构建多个版本
  • 别用中文或特殊字符——有些工具对 Unicode 支持不好

3.2 版本号语义化——让版本说话

语义化版本,说白了就是让版本号自己告诉你:这次更新有多大动静。

标准格式是:

主版本号.次版本号.修订号

规则其实很简单:

版本位 什么时候加 举个例子
主版本 不兼容的 API 修改 2.0.0 → 3.0.0
次版本 向下兼容的功能新增 2.1.0 → 2.2.0
修订号 向下兼容的问题修复 2.1.3 → 2.1.4

我曾经接手过一个项目,版本号从 1.0.0 直接跳到 2.0.0,结果只是改了个日志格式。你想想看,这要是让下游团队看到了,不得吓一跳?他们以为 API 全变了,实际上啥都没动。

我的小技巧: 在 CI/CD 流程中自动生成版本号。比如用 Git 的 tag 来触发构建,这样版本号和代码提交就能一一对应。

还有一个细节:预发布版本怎么处理?我习惯用这样的格式:

1.0.0-alpha.1
1.0.0-beta.2
1.0.0-rc.3

alpha 是内部测试,beta 是公开测试,rc 是发布候选。这样团队里每个人都能清楚知道,这个镜像处于什么阶段。

3.3 镜像仓库的清理策略——别让仓库变成垃圾场

镜像仓库这东西,你不清理,它就会慢慢膨胀。我记得有次帮客户做审计,发现他们的 Harbor 仓库里躺着 3000 多个镜像,其中 80% 都是三个月前的旧版本。磁盘空间直接爆了。

清理策略,我总结了三板斧:

  1. 按时间清理——保留最近 N 天的镜像
  2. 按版本清理——只保留每个主版本的最近几个次版本
  3. 按标签清理——删除所有 latest 和 dev 标签的旧镜像

具体怎么配?拿 Harbor 举例:

# 清理策略示例
- 保留最近 30 天的镜像
- 每个仓库最多保留 10 个标签
- 删除所有未打标签的镜像
- 保留每个主版本的最后 3 个次版本
注意: 清理策略一定要先模拟运行,确认不会误删生产镜像。我曾经见过有人把清理策略写反了,结果线上镜像全被删了...那场面,简直灾难。

还有一个容易被忽略的点:镜像的层(layer)清理。你删除了一个镜像,但它的层可能还被其他镜像引用。所以清理的时候,要确保层也被真正释放了。

我建议用这样的流程:

1. 标记过期镜像
2. 等待 7 天观察期
3. 确认没有回滚需求
4. 执行清理
5. 验证磁盘空间释放

这个观察期很重要。你想想看,万一刚删完就发现需要回滚,那不就傻眼了?

3.4 知识体系总览

下面这张图,把镜像版本管理的核心逻辑串起来了:

镜像版本管理核心逻辑 标签规范 语义化版本 清理策略 项目名-版本号-构建号 避免使用 latest 标签 主版本.次版本.修订号 alpha/beta/rc 预发布 按时间/版本/标签清理 设置观察期避免误删 目标:可追溯、可回滚、可清理 标签唯一 → 版本清晰 → 仓库整洁

说白了,镜像版本管理就三个目标:可追溯、可回滚、可清理。标签规范保证你能找到它,语义化版本告诉你它是什么,清理策略确保仓库不会爆炸。

最后说一句:这些规范最好写进团队的 CI/CD 流程里,靠人肉执行迟早会出问题。自动化才是王道。