Docker stop 无响应说明 PID 1 未接收或未处理 SIGTERM,Docker 守护进程仍在等待其退出;常见于应用未监听信号、shell 启动导致信号拦截,或 WSL2/vmmem 僵死等底层问题。

docker stop 无响应,容器卡在 Up 状态
这说明 PID 1 进程没收到或没处理 SIGTERM,Docker 守护进程还在等它自己退出。常见于 Node.js/Python 应用未监听信号、或用 sh -c "your_cmd &" 启动导致主 shell 提前退出、子进程变孤儿。
先确认是否真卡住:docker inspect -f '{{.State.Status}} {{.State.StoppedReason}}' container_name。如果 StoppedReason 是空,且状态仍是 running,说明信号根本没传进去。
- 检查入口命令是否用了
exec:比如CMD ["exec", "node", "server.js"],避免 shell 封装导致信号被拦截 - 确认应用代码里注册了
SIGTERM处理逻辑(如 Go 的signal.Notify、Node.js 的process.on("SIGTERM")) - 临时加个调试命令验证信号可达:
docker exec -it container_name kill -15 1,再看日志是否打印出“收到 SIGTERM”
docker kill -f 也不生效,vmmem 或 wsl2 进程僵死
Docker Desktop 在 Windows 上依赖 WSL2,一旦 vmmem 进程卡住,容器层面的 stop/kill 命令可能完全失效——不是容器问题,而是底层虚拟机没响应。
此时终端执行 docker stop 会 hang 住,docker ps 可能也卡,docker info 返回超时。这不是配置问题,是 WSL2 实例失去通信。
- 立即执行:
wsl --shutdown(需管理员权限的 PowerShell 或 CMD) - 检查
%UserProfile%\.wslconfig是否存在内存限制过低(如memory=512MB),导致 vmmem 频繁 OOM 卡死 - 重启 Docker Desktop 前,确保 WSL2 已彻底关闭:
wsl -l -v应显示所有发行版为Stopped
容器已 Exited,但 docker rm -f 报 conflict 或 no such container
这是典型的命名冲突残留:旧容器虽已退出,但其网络端点、卷挂载或自定义网络中的名字条目仍被占用,Docker 守护进程拒绝复用同名资源。
错误信息常含 Error response from daemon: Conflict, cannot remove the default name of the container 或 No such container(实际 docker ps -a 能看到)。
- 先清理网络残留:
docker network disconnect --force bridge container_name(bridge 是默认网络名,若用自定义网络请替换) - 强制移除容器时跳过名称校验:
docker rm -f $(docker ps -aq --filter name=^container_name$)(用正则锚定精确匹配) - 若仍失败,检查
/var/lib/docker/network/files/local-kv.db(Linux)或 WSL2 内对应路径,但不建议手动删,优先重启 dockerd
日志里只显示 Killed,但没看到 SIGTERM 处理日志
退出码为 137 且日志结尾是 Killed,基本可断定是 OOM Killer 在宿主机层面干掉了进程,而非 Docker 发送的 SIGTERM。Docker Desktop 的 WSL2 默认内存上限是 2GB,跑 Java 或数据库类容器极易触达。
注意:这个 Killed 不来自 docker stop 流程,而是 Linux kernel 的 OOM Killer 主动介入,此时连 SIGTERM 都来不及发。
- 查证方式:
docker inspect container_name | grep -i oomkilled,返回true即实锤 - 调高 WSL2 内存限额:编辑
%UserProfile%\.wslconfig,加入memory=4GB,然后wsl --shutdown再重启 Docker Desktop - 容器启动时显式限制内存,避免吃尽 WSL2 总量:
docker run -m 2g ...,让 OOM Killer 作用范围收窄到单个容器
rm -f,先用 inspect 和 wsl --shutdown 锁定故障面。


















