Убить все контейнеры с заданным именем образа, КРОМЕ самого последнего.

У меня есть процесс на задании cron, который запускается каждые 30 минут. Процесс запускает док-контейнер с заданным именем образа. Иногда процесс, работающий в док-контейнере, зависает, и тогда у меня работает несколько док-контейнеров; чем больше я бегу, тем больше он увязает. Конечно, есть основные проблемы, которые вызывают это (над ними тоже работают). Для ЭТОГО вопроса я хочу знать, есть ли способ убить все запущенные контейнеры докеров с заданным именем изображения, ЗА ИСКЛЮЧЕНИЕМ последнего запущенного контейнера?

Я посмотрел на этот SO вопрос, и он показывает, как убить все их. Есть ли способ исключить самый последний контейнер?

Я работаю в Linux, и я хотел бы написать сценарий оболочки, который можно было бы вызывать для этого при необходимости.


person Jed    schedule 04.02.2021    source источник


Ответы (1)


Используйте для этого флаги docker ps -l и -f. например.:

docker ps -l -f ancestor=grafana/grafana

-f ancestor указывает изображение для фильтрации, а -l отображает последний контейнер для указанного фильтра-предка.

Затем мы можем использовать это вместе с awk, чтобы получить список идентификаторов контейнеров, которые не являются последними:

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)

Мы дважды обрабатываем команду docker ps в awk как два отдельных входа, первый из которых имеет последний отфильтрованный вывод, а второй — все контейнеры с заданным фильтром. При первом вводе (NR==FNR) мы пропускаем заголовок (FNR>1) и устанавливаем переменную Dockid в идентификатор контейнера (первое поле, разделенное пробелами). Затем при втором вводе мы печатаем идентификаторы контейнеров, которые не совпадают. как dokid, но в то же время исключая любые заголовки.

Соединяем это с докером 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))
person Raman Sailopal    schedule 04.02.2021
comment
Я взволнован, чтобы попробовать это. - person Jed; 08.02.2021
comment
Это сработало отлично! Единственная модификация заключалась в том, что я пытался kill все контейнеры, поэтому вместо docker rm ... я использовал docker kill ... - person Jed; 10.02.2021