【问题标题】:Kill all containers with given image name EXCEPT the most recent one杀死所有具有给定镜像名称的容器,除了最近的一个
【发布时间】:2021-05-08 20:16:35
【问题描述】:

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

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

我在 Linux 中工作,我愿意编写一个可以在需要时调用的 shell 脚本。

【问题讨论】:

    标签: linux docker terminal kill


    【解决方案1】:

    为此使用 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))
    

    【讨论】:

    • 我很高兴能尝试一下。
    • 这很棒!唯一的修改是我试图kill所有容器,所以我使用docker rm ...而不是docker kill ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 2013-07-27
    • 2012-07-27
    • 1970-01-01
    • 2011-09-16
    相关资源
    最近更新 更多