Commit b49d3e14 by luoqi

fix(deploy): 部署先 stop 再 force-recreate —— rootless podman 删不掉运行中容器的网络进程

2026-08-04 新生产机(Ubuntu 26.04,运维刻意配的 rootless podman:非 root 账号 +
netavark/pasta,攻击面更小)实测:
  rootless netns: kill network process: permission denied
  Error: ... up -d --force-recreate pac-service: exit status 1
失败还留下 <hash>_pac-pac-service-1 半成品容器,要手工清。

根因:force-recreate 要删**运行中**的容器,rootless 杀不掉其网络进程。
手动 stop → rm 实测正常,说明不是普遍权限问题,只是删运行中容器这条路走不通。

改为先 stop 再 up --force-recreate:
  · rootless podman 下通过(网络进程正常退出后再删)
  · docker 上语义等价甚至更彻底(stop 后必然重建,不依赖 compose 判定)
  · 仍保留 --force-recreate,不退回裸 up -d —— 那正是本脚本要绕开的 compose diff 缺陷

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
parent ae624632
Pipeline #3530 failed in 0 seconds
......@@ -82,6 +82,17 @@ main() {
log "build 镜像(显式,不和 up 混)"
"${COMPOSE[@]}" build "${SERVICES[@]}"
# ⭐ 先 stop 再 up,**不用 `up -d --force-recreate`**(2026-08-04 新生产机实测)。
# rootless podman(运维刻意选的形态:非 root 账号 + netavark/pasta,攻击面更小)下,
# force-recreate 要删**运行中**的容器,而 rootless 杀不掉它的网络进程:
# rootless netns: kill network process: permission denied
# 失败还会留下 `<hash>_pac-pac-service-1` 这样的半成品容器,得手工清。
# 而"先 stop 让网络进程正常退出、再让 up 重建"实测通过 —— 且在 docker 上语义等价
# (甚至更彻底:stop 后容器必然重建,不依赖 compose 判定),故两种运行时统一走这条路。
# ⚠️ 仍然不能退回裸 `up -d`:那正是本脚本要绕开的 compose diff 缺陷(见文件头)。
log "stop 旧容器(让网络进程正常退出;rootless 下不能直接删运行中容器)"
"${COMPOSE[@]}" stop "${SERVICES[@]}" || true
log "force-recreate(不信 compose 的重建判定)"
"${COMPOSE[@]}" up -d --force-recreate "${SERVICES[@]}"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment