fix(deploy): force-recreate 失败才回退 stop —— 只在 rootless 上多做一步
rootless podman 下 `up -d --force-recreate` 要删**运行中**的容器,而 rootless 杀不掉
它的网络进程,直接失败:
rootless netns: kill network process: permission denied
失败还留下 <hash>_<proj>-<svc>-1 半成品容器,不清则重建报名字冲突。
改为:主路径不变(直接 force-recreate),**仅在它失败时**回退 ——
清残留 → stop → 重建。docker 侧一行路径都没变,podman 侧多走一次回退。
【停机实测,顺带纠正我自己两次错判】2026-08-04 三组对照(0.5s 间隔探 /health):
docker + 直接 force-recreate ~16s
docker + 先 stop 再 recreate 15.97s
podman + 先 stop 再 recreate 5.44s
即 **部署本来就有约 16 秒停机,一直如此** —— force-recreate 不是滚动更新,
它就是停旧起新。
⚠ ️ 第一轮曾测出 docker「0 停机(535 样本全 200)」,那是**测量错误**:
探测有 300s 上限,而那次是全量构建、耗时更长,容器重建发生在探测结束之后
(实测 probe 比 deploy 早结束 29s),535 个样本全采自"还在 build、老容器好好跑着"的阶段。
我据此先判「本改动引入退化」、后判「修正后恢复零停机」,两次都错。
教训:探测窗口必须覆盖被测阶段,否则"全绿"只是没看见。
本改动保留的理由因此不是"避免退化",而是**改动面最小**:docker 走原路径,
只有 rootless 才多一步。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Showing
Please
register
or
sign in
to comment