杀死所有具有给定图像名称的容器,除了最近的一个

Kill all containers with given image name EXCEPT the most recent one

我有一个每 30 分钟启动一次的 cron 作业进程。该进程启动一个具有给定图像名称的 docker 容器。有时 docker 容器中的进程 运行 陷入困境,然后我最终得到几个 docker 容器 运行;我拥有的 运行 越多,它就越陷入困境。当然,有一些潜在的问题导致了这一点(他们也在努力解决)。对于这个问题,我想知道“除了最后一个启动的容器 运行 之外,有没有办法杀死具有给定图像名称的所有 运行 docker 容器?”

我看了这个,它展示了如何杀死所有的人。有没有办法排除最近的容器?

我在 Linux 工作,我愿意编写一个 shell 脚本,可以在需要时调用它来执行此操作。

为此使用 docker ps -l 和 -f 标志。例如:

docker ps -l -f ancestor=grafana/grafana

-f ancestor 指定要过滤的图像,-l 显示指定祖先过滤器的最新容器。

然后我们可以将它与 awk 一起使用来获取不是最新的容器 ID 的列表:

awk 'NR==FNR && FNR>1 { dockid=;next } FNR>1 && !=dockid { print  }' <(docker ps -l -f ancestor=grafana/grafana) <(docker ps -f ancestor=grafana/grafana)

我们在 awk 中将 docker ps 命令处理两次作为两个单独的输入,第一个具有最新的过滤输出,第二个具有给定过滤器的所有容器。对于第一个输入 (NR==FNR),我们错过了 header (FNR>1) 并将变量 dockid 设置为容器 ID(第一个 space 分隔字段)然后对于第二个输入,我们打印同时与 dockid 不同的容器 ID,不包括任何 headers.

将其与 docker rm:

放在一起
docker rm $(awk 'NR==FNR && FNR>1 { dockid=;next } FNR>1 && !=dockid { print  }' <(docker ps -l -f ancestor=grafana/grafana) <(docker ps -f ancestor=grafana/grafana))