2

我们正在结合使用 Jenkins 和 Docker。我们已经建立了 Jenkins 主/从模型,并且容器在从代理中旋转。有时由于 jenkins docker 插件中的错误或某些未知原因,容器会悬空。

杀死它们需要时间,每个容器进程大约需要 5 秒,我们有大约 15000 个。大约需要 24 小时才能完成运行清理作业。如何一次取出一堆容器?或有效地减少时间?

  1. 会卸载 docker 客户端,删除容器吗?
  2. 是否有保留这些容器进程的卷,可以删除(坏主意)
  3. 任何线程/并行性可以更快地删除它们?我将每周运行一次 cron 作业来修补这些错误,但现在我没有一整天的时间来删除这些错误。
4

3 回答 3

3

试试这个:

  1. 卸载 docker-engine
  2. 重启主机
  3. rm /var/lib/docker

重新启动有效地停止了所有容器,卸载 docker 可以防止它们在重新启动时返回。(如果他们已经restart=always设置)

于 2016-09-06T16:44:29.200 回答
3

如果您只对没有正确退出的进程感兴趣(我对您的意思的评估——如果我错了,请纠正我),有一种方法可以遍历正在运行的容器进程并使用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

对正在发生的事情的清晰解释:

  1. 我正在向 docker 引擎询问所有正在运行的容器(的docker ps)的“仅完整容器 ID”列表
  2. docker inspect一一通过,要求只输出进程 ID ( .State.Pid),它
  3. 然后我传递给kill -9让系统直接杀死容器进程;比等待引擎这样做要快得多。

同样,不建议将其用于一般用途,因为它不允许容器化进程的标准(干净)退出处理,但在您的情况下,这听起来不是重要的标准。

如果这些退出的容器有剩余的容器元数据,您可以使用以下方法清除它:

docker rm $(docker ps -q -a --filter status=exited)

这将从引擎的元数据存储(/var/lib/docker内容)中删除所有退出的容器,并且每个容器应该相对较快。

于 2016-09-06T20:01:32.130 回答
1

所以,

docker kill $(docker ps -a -q)

不是你需要的吗?

编辑:显然不是。然后我的下一个镜头:

A)以某种方式创建您要停止的所有容器的列表。

B)对该列表进行分区(也许只需将其切成n部分)。

C) 并行踢n个作业,每个作业都处理这些列表切片中的一个。

D)希望“docker”足够强大,可以处理 n 个进程并行发送n 个终止请求。

E)如果这真的有效:也许开始试验以确定n的最佳设置。

于 2016-09-06T15:39:48.173 回答