记住这句黄金法则:选择 latest 标签等于选择不确定性,而固定版本才是稳定可靠的代名词。生产环境中务必做到这几点:远离 latest、备份数据先行、避免跨越大版本升级、升级后验证环节不能少。
之前在我们付费进阶群里解答问题时,遇到一个新手很容易踩的典型问题:在 Docker 环境中使用 latest 标签部署 GitLab 服务。

一、故障现象
他之前部署了一套 GitLab 服务,今天早上发现无法登录了。查看容器状态时,发现服务一会儿显示为运行状态,过一会儿又自动重启,如此反复。

查看日志时,发现关键的配置文件加载失败。

关键日志线索:配置文件似乎出现了损坏迹象。
Malformed configuration JSON file found ...This usually happens when your last run of `gitlab-ctl reconfigure` didn’t complete successfully.
经过详细询问,发现他使用了 latest 标签来运行 GitLab 容器。

根本原因分析:表面上看是配置文件损坏,但问题的根源并不在配置本身,而在于这个用户使用的是:
image: gitlab/gitlab-ce:latest
没错,罪魁祸首就是这个看似方便的 latest 标签。
最终解决方案:删除有问题的配置文件,将 latest 标签替换为具体的版本号,然后重新启动容器。
二、为什么不能用 latest
很多人为了省事,觉得 latest 就是"最新版",用起来方便,还不用记版本号。但在生产环境里,这其实是一颗随时可能引爆的定时炸弹。
1. 版本不可控
latest 并非固定版本,它永远指向仓库里最新推送的镜像。今天可能是 16.2,明天就变成 16.5 了。你以为环境没动过,实际上已经"偷偷升级"了。
2. 兼容性风险
每个大版本之间的差异往往很大。
配置文件格式变了、数据库结构变了、依赖环境升级了只要有一点不兼容,就可能导致服务无法正常启动。
3. 排障困难
出问题时,你连"自己跑的到底是哪一个版本"都说不清楚。这让故障排查、版本回滚、问题复现都变得异常困难。
4. 自动更新 = 自动踩坑
如果有 CI/CD 流水线或者镜像自动更新机制,latest 会在你不知情的情况下被替换成新版本。想象一下:凌晨 3 点服务突然挂掉,原因竟然是镜像自动更新到了一个不兼容的版本。
三、容器部署正确做法
1. 固定版本号
明确指定镜像版本,而不是依赖 latest。
# 错误做法image: redis:latest# 正确做法image: redis:7.2.4
这样做的好处很明显:
版本可控可复现、升级由自己掌握2. 持久化存储
大多数服务都会有数据目录,比如:
GitLab:/etc/gitlab、/var/opt/gitlab、/var/log/gitlabMySQL:/var/lib/mysql这些目录必须挂载到宿主机或持久化卷,否则容器一删数据就全没了。
3. 升级要有计划
不要依赖 latest 自动升级,而是应该:
查看最新升级路径、先在测试环境验证、生产环境逐步升级比如 GitLab 最新要求不能跨大版本直接升级,必须按照 15.x → 16.0 → 16.5 这样的路径进行。
4. 升级前必须备份
无论是 GitLab、MySQL 还是其他服务,升级前一定要备份数据。
5. 升级后要验证
升级完成后,不要觉得"能启动就行",还需要:
检查版本号、检查数据库迁移情况、跑一遍关键功能验证记住这句经验之谈:latest 等于不稳定,固定版本才可控;不用 latest、不忘备份、不跨大版本、不忘验证。
