如果您只对没有正确退出的进程感兴趣(我对您的意思的评估——如果我错了,请纠正我),有一种方法可以遍历正在运行的容器进程并使用Pid
来自的信息杀死它们容器的元数据。看来您此时不一定关心干净的进程关闭(这就是为什么docker kill
每个容器需要这么长时间 - 容器可能无法响应正确的信号,因此引擎会耐心等待,然后终止进程) ,然后 akill -9
是结束这些容器并清理的更迅速和激烈的方式。
使用最新的 docker 版本进行的快速测试表明,我可以在相对现代的笔记本电脑上在 11.5 秒内杀死大约 100 个容器:
$ time docker ps --no-trunc --format '{{.ID}}' | xargs -n 1 docker inspect --format '{{.State.Pid}}' $1 | xargs -n 1 sudo kill -9
real 0m11.584s
user 0m2.844s
sys 0m0.436s
对正在发生的事情的清晰解释:
- 我正在向 docker 引擎询问所有正在运行的容器(的
docker ps
)的“仅完整容器 ID”列表
- 我
docker inspect
一一通过,要求只输出进程 ID ( .State.Pid
),它
- 然后我传递给
kill -9
让系统直接杀死容器进程;比等待引擎这样做要快得多。
同样,不建议将其用于一般用途,因为它不允许容器化进程的标准(干净)退出处理,但在您的情况下,这听起来不是重要的标准。
如果这些退出的容器有剩余的容器元数据,您可以使用以下方法清除它:
docker rm $(docker ps -q -a --filter status=exited)
这将从引擎的元数据存储(/var/lib/docker
内容)中删除所有退出的容器,并且每个容器应该相对较快。