容器卡在Removing状态是containerd task死锁所致,需先用sudo ctr -n moby tasks ls确认task状态为RUNNING或STOPPING,再查journalctl日志含"failed to delete task"等线索,接着kill -9 containerd-shim进程,必要时手动清理/var/lib/containerd/io.containerd.runtime.v2.task/moby/下对应容器ID目录并重启containerd。

容器卡在 Removing 状态,说明 Docker Engine 已发起删除动作,但底层 containerd task 未完成清理——这不是命令没执行,而是运行时死锁了。
确认是否为 containerd task 死锁
先别急着重启或删文件,得验证是不是底层阻塞:
- 运行
sudo ctr -n moby tasks ls,找对应容器 ID 的 task 行;如果状态是RUNNING或长时间停在STOPPING,就是 task 层卡死 - 查日志:
sudo journalctl -u containerd -n 50 --no-pager | grep -i "task\|shim\|exit",看到failed to delete task或wait pid failed就基本坐实 -
docker ps -a显示状态为Removal In Progress或Exited但 PID 仍存在(ps aux | grep [container_id]能搜到),也是典型表现
终止 shim 进程释放 task 锁
containerd-shim 是每个容器的生命周期代理,它挂住会导致整个 task 无法退出。这是最常用、见效最快的破局点:
- 定位 shim:
ps aux | grep 'containerd-shim.*[容器ID前8位]'(比如容器 ID 是a1b2c3d4...,就搜a1b2c3d4) - 强制杀掉:
sudo kill -9 $(pgrep -f "containerd-shim.*[容器ID前8位]") - 再试一次
docker stop [容器ID]或docker rm [容器ID],大概率立刻返回成功
手动清理残留元数据(shim 杀完还不行时)
shim 进程没了,但 containerd 内部状态可能没同步,task 目录和容器对象还躺在磁盘上:
- 停 containerd:
sudo systemctl stop containerd - 进元数据目录:
cd /var/lib/containerd/io.containerd.runtime.v2.task/moby/ - 删对应容器 ID 的子目录:
sudo rm -rf [容器ID]*(注意通配符,避免删错) - 重启 containerd:
sudo systemctl start containerd - 此时
docker ps -a应该已看不到该容器;若仍有残留,再补删/var/lib/docker/containers/[容器ID]/(仅限确认容器不可恢复)
遇到 .fuse_hiddenxxxx 反复创建怎么办
有些容器卡在 Removal In Progress 时,宿主机容器目录里会不断生成 .fuse_hiddenxxxx 隐藏文件,ls -A 才能看见——这说明有进程还在访问该容器的挂载点:
- 进容器目录:
cd /var/lib/docker/containers/[容器ID]/ - 查谁在用:
lsof .fuse_hidden*或lsof mounts/shm(常见于shm或secrets挂载点) - 拿到 PID 后直接杀:
sudo kill -9 [PID] - 再删目录:
sudo rm -rf [容器ID],然后docker rm -f [容器ID]才会真正生效
真正麻烦的从来不是命令记不牢,而是卡住时不知道该看哪个进程、哪个目录、哪条日志。task 死锁没有“一键修复”,但路径很固定:shim → task 元数据 → fuse 挂载点。每一步都对应一个明确的检查命令和干预动作,漏掉任意一环,删都删不干净。


















