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

问题描述

我有一个每 30 分钟启动一次的 cron 作业进程。该过程使用给定的图像名称启动一个 docker 容器。有时在 docker 容器中运行的进程会陷入困境,然后我最终会运行多个 docker 容器;我跑得越多,它就越陷入困境。当然,有一些潜在的问题导致了这种情况(他们也在着手解决)。对于这个问题,我想知道“有没有办法用给定的图像名称杀死所有正在运行的 docker 容器,除了最后一个开始运行的容器?”

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

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

解决方法

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

docker ps -l -f ancestor=grafana/grafana

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

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

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

我们在 awk 中将 docker ps 命令作为两个单独的输入处理两次,第一个具有最新的过滤输出,第二个具有给定过滤器的所有容器。对于第一个输入 (NR==FNR),我们忽略了标头 (FNR>1) 并将变量 dockid 设置为容器 ID(第一个空格分隔字段)然后使用第二个输入,我们打印不相同的容器 ID作为dockid,同时打折任何标题。

将其与 docker rm 放在一起:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...