docker build -t registry.local/app:20261109-a1b2c3 .
docker push registry.local/app:20261109-a1b2c3
docker pull registry.local/app@sha256:9f2c
docker tag registry.local/app:20261109-a1b2c3 app:latest

上线二十分钟发现接口报错,要回滚时 docker pull app:latest 拿到的还是刚发的坏版本,上一版在仓库里已经被覆盖,只能重新构建一次。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,构建只用一个 latest 标签,每次推送都覆盖同名标签,旧镜像的 manifest 被顶掉,回滚时没有任何可指向的版本,只能硬着头皮修复,生产上很被动。

「镜像回滚 tag」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

处理上按这个顺序:每次构建用 commit sha 或时间戳打不可变 tag 一个版本一个名字;latest 只当别名用 回滚的时候一律按 digest 去拉取 这个顺序不能反;推送完成后把 digest 记进发布单 回滚时直接引用它 别凭记忆找。

改完只确认一件事:回滚按 digest 拉到镜像启动后接口正常,版本号回到上一版,线上错误随即消失。

作者 9823189