我们正在组合使用Jenkins和Docker ..我们已经设置了Jenkins,就像主/从模型一样,容器在slave代理中运行。 有时由于jenkins docker插件中的错误或由于某些未知原因,容器悬空。
杀死它们都需要时间,每个容器过程大约需要5秒钟,我们大约有15000个。将需要~24小时才能完成清理工作。如何一次性取出一堆容器?或有效地减少时间?
答案 0 :(得分:3)
试试这个:
rm /var/lib/docker
重新启动会有效地停止所有容器,并且卸载docker会阻止它们在重新启动时返回。 (如果他们设置restart=always
)
答案 1 :(得分:1)
所以,
docker kill $(docker ps -a -q)
不是你需要的?
编辑:显然不是。我的下一个当时:A)以某种方式创建一个您想要停止的所有容器的列表。
B)列出的分区(可能只是将其切成 n 部分)。
C)并行启动 n 作业,每个作业都使用其中一个列表切片。
D)希望“docker”足够强大,能够处理并行发送 n kill请求的n个进程。
E)如果确实有效:可能会开始尝试确定 n 的最佳设置。
答案 2 :(得分:1)
如果你有兴趣只杀死进程,因为它们没有正常退出(我对你的意思进行评估 - 如果我错了就纠正我),有办法走过正在运行的容器进程并杀死他们使用容器元数据中的Pid
信息。看起来你现在不必关心清洁过程关闭(这就是为什么docker kill
每个容器需要这么长时间 - 容器可能无法响应正确的信号,因此引擎耐心等待,然后杀死过程),然后kill -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 ps
)docker inspect
,要求只输出进程ID(.State.Pid
),kill -9
让系统直接杀死容器进程;比等待发动机快得多。同样,这不建议用于一般用途,因为它不允许对容器化过程进行标准(清洁)退出处理,但在您的情况下,听起来这不是重要标准。
如果这些已退出的容器有剩余的容器元数据,您可以使用以下方法清除它:
docker rm $(docker ps -q -a --filter status=exited)
这将从引擎的元数据存储中删除所有已退出的容器(/var/lib/docker
内容),并且每个容器应该相对较快。