报错是这么冒出来的。CentOS 7.9 上跑 docker 20.10,进容器排查问题习惯用 docker attach,敲完 Ctrl+C 想退出,结果整个业务容器直接 Exited,前端接口瞬间全 502。
中间走过弯路,把「用的不是 -it 加 --sig-proxy 的组合,按键行为和在本地敲完全一样」当成主因,改完现象没变。
真正麻烦的地方在于,几个原因的现象几乎一样。attach 是把终端的信号直接转给容器里的 1 号进程,Ctrl+C 发的是 SIGINT。也可能是容器主进程没有接管信号,收到 SIGINT 就按默认动作退出。
另外,退出方式应该用 Ctrl+P 加 Ctrl+Q,很多人在这一步按错。
上来先确认容器是不是被信号打停的
docker inspect -f '{{.State.ExitCode}} {{.State.Error}}' web
随后重新拉起容器并保持 detach 的退出习惯
docker start web && docker attach --sig-proxy=false web
需要看日志时改用 logs 加 tail
docker logs -f --tail 200 web
末了核对容器已恢复且端口在听
docker ps --filter name=web && ss -lntp | grep 8080
恢复的判定其实很直接。docker ps 里容器状态是 Up,ExitCode 不再是 130,接口恢复 200,之后再 attach 用 Ctrl+P 加 Ctrl+Q 退出不再影响进程。
这里还有个坑。attach 只适合临时看输出,排查问题优先用 docker logs 或 exec 起一个 shell;生产容器还应该让主进程正确捕获 SIGTERM 做优雅退出。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
