Docker: фильтровать контейнеры по изображению, игнорируя тег, затем изображения

#docker #containers

#docker #контейнеры

Вопрос:

Мне нужно удалить серию открытых контейнеров, которые являются производными от изображения, которое я помечал много раз, поэтому у меня много версий. У меня также запущено множество контейнеров (которые оставались зависшими после различных тестов, которые я проводил с различными версиями контейнера).

Какие команды позволяют быстро удалить их все? (Т.Е. на основе имени изображения или чего-то еще)

Я обнаружил, что вы можете сделать

 docker container stop $(docker container ls -aq --filter "ancestor=imagename")
 

Но это не работает с различными помеченными версиями (например, imagename: 1.0, imagename: 2.0)

итак, чтобы получить их все, мне пришлось использовать

 docker container stop $(docker container ls -aq --limit 30)
 

Который получает контейнер, созданный до 1 месяца назад.

Prune просто очистил несколько из них.

Я не буду перечислять все команды, которые я пробовал.

Пожалуйста, скажите мне, какой самый быстрый и чистый способ очистить изображение и все последующие помеченные версии, а также связанные с ними соответствующие контейнеры, которые запущены или завершены.

Спасибо

Ответ №1:

Разве вы не можете просто использовать какую-нибудь магию Linux? Например

 docker ps | grep <image-name> | awk '{ print $1 }' | xargs docker stop
 

Объяснение:

  • docker ps показать запущенные контейнеры
  • grep <image-name> выполните поиск по имени изображения в выводе предыдущей команды
  • awk '{ print $1 }' возьмите первый «столбец» (в данном случае идентификатор контейнера)
  • xargs docker stop передайте идентификаторы в docker stop

Аналогично, вы можете просто использовать другие команды bash для удаления контейнеров и удаления изображений:

 docker ps -a | grep <image-name> | awk '{ print $1 }' | xargs docker container rm
 
 docker image ls | grep <image-name> | awk '{ print $3 }' | xargs docker rmi
 

Небольшое предупреждение: grep не является специфичным для docker и будет фильтровать только на основе содержимого строки, поэтому, если имя вашего изображения появляется в именах контейнеров или где-либо еще, этот метод также остановит / удалит эти контейнеры!

Комментарии:

1. Да, я мог бы использовать это, если бы знал! Или, лучше сказать, я уже знал их, но я недостаточно опытен, чтобы собрать их вместе. Я постараюсь использовать это в качестве ответа, если это сработает для меня! Спасибо

2. Есть ли у нас что-то подобное в Windows?