Остановка контейнеров Docker по имени образа - Ubuntu

В Ubuntu 14.04 (Trusty Tahr) я ищу способ остановить работающий контейнер, и единственная информация, которая у меня есть, - это имя образа, которое использовалось в команде запуска Docker.

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


person Collin Estes    schedule 18.08.2015    source источник


Ответы (17)


После проблемы 8959 хорошим началом будет:

docker ps -a -q --filter="name=<containerName>"

Поскольку name относится к контейнеру, а не к имени изображения, вам нужно будет использовать более свежий предок фильтра Docker 1.9, упомянутый в koekiebox answer.

docker ps -a -q  --filter ancestor=<image-name>

Как прокомментировал ниже kiril, для удаления этих контейнеров:

stop также возвращает контейнеры.

Таким образом, объединение stop и rm выполнит свою работу:

docker rm $(docker stop $(docker ps -a -q --filter ancestor=<image-name> --format="{{.ID}}"))
person VonC    schedule 18.08.2015
comment
Отлично. Моя проблема после этого заключается в удалении контейнеров, поскольку они остановлены, они не возвращаются docker pd. Есть подсказки, как это сделать? - person kiril; 11.12.2015
comment
Контейнер, остановленный @kiril, возвращается ps -a. Удалены контейнеры ... ну, они удалены, их больше не существует. - person VonC; 11.12.2015
comment
Спасибо, я не понял, что остановка возвращает контейнеры. Таким образом, цепочка stop и rm выполнит свою работу: docker rm $ (docker stop $ (docker ps -a -q --filter = name = ‹imageName›)) - person kiril; 11.12.2015
comment
@kiril Это идея, да. - person VonC; 11.12.2015

Предыдущие ответы не сработали для меня, но это сработало:

docker stop $(docker ps -q --filter ancestor=<image-name> )
person Koekiebox    schedule 20.01.2016
comment
Интересное использование предка (docs.docker.com/engine/reference/commandline / ps / # filtering). +1 - person VonC; 20.01.2016
comment
Также работает с Docker Terminal для Windows. - person Koekiebox; 14.06.2016
comment
У меня это не работает в Ubuntu 20.04 с Docker версии 20.10.5, сборка 55c4c88. команда docker ps -q --filter ancestor=<image-name> ничего не возвращает, а команда docker ps -a -q --filter ancestor=<image-name> из принятого ответа возвращает идентификаторы контейнеров, которые совпадают. - person JoanComasFdz; 01.04.2021

Вы можете запустить контейнер, задав имя контейнера:

docker run -d --name <container-name> <image-name>

Один и тот же образ можно использовать для раскрутки нескольких контейнеров, так что это хороший способ запустить контейнер. Затем вы можете использовать это имя контейнера, чтобы остановить, прикрепить ... контейнер:

docker exec -it <container-name> bash
docker stop <container-name>
docker rm <container-name>
person Javier Sánchez    schedule 14.04.2016
comment
Мне очень нравится это решение. Есть ли лучший способ построить, остановить / удалить, а затем запустить контейнер, чем этот? sudo docker build . -t <img-name> && sudo docker stop <container-name> || true && sudo docker run -d --rm --name <container-name> <img-name> - person melanke; 12.09.2019

Этот код остановит все контейнеры с изображением centos: 6. Я не мог найти более легкого решения для этого.

docker ps | grep centos:6 | awk '{print $1}' | xargs docker stop

Или даже короче:

docker stop $(docker ps -a | grep centos:6 | awk '{print $1}')
person ArgonQQ    schedule 14.06.2016
comment
нужно улучшение :::: docker stop $ (docker ps -a | grep centos: 6 | awk '{print $ 1}') - person Shailesh kumar; 22.02.2017
comment
@Shaileshkumar Добавил вашу версию =) - person ArgonQQ; 25.02.2017

Два способа остановить запуск контейнера:

1. $docker stop container_ID

2. $docker kill container_ID

Вы можете запустить контейнеры, используя следующую команду:

$docker ps

Следуя ссылкам для получения дополнительной информации:

person kalyani chaudhari    schedule 28.06.2016
comment
Последняя ссылка не работает (К сожалению, мы не можем найти эту страницу). - person Peter Mortensen; 23.07.2018
comment
Буквально $docker? Или $ из командной строки? - person Peter Mortensen; 23.07.2018

Для версии Docker 18.09.0 я обнаружил, что флаг формата не нужен

docker rm $(docker stop $(docker ps -a -q -f ancestor=<image-name>))
person ankitj    schedule 19.12.2018

Остановить контейнер докеров по имени изображения:

imagename='mydockerimage'
docker stop $(docker ps | awk '{split($2,image,":"); print $1, image[1]}' | awk -v image=$imagename '$2 == image {print $1}')

Остановить контейнер докеров по имени и тегу изображения:

imagename='mydockerimage:latest'
docker stop $(docker ps | awk -v image=$imagename '$2 == image {print $1}')

Если вы создали изображение, вы можете добавить к нему метку и отфильтровать запуск контейнеров по этикетке

docker ps -q --filter "label=image=$image"

Ненадежные методы

docker ps -a -q  --filter ancestor=<image-name>

не всегда работает

docker ps -a -q --filter="name=<containerName>"

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

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

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

person Jay    schedule 10.05.2019

Я сделал /usr/local/bin/docker.stop, который принимает имя изображения (предполагается, что у вас работает только один).

docker stop $(docker ps -q -f "name=$1")
person AmanicA    schedule 08.09.2015

Я пытался обернуть свои команды Docker в задачи gulp и понял, что вы можете делать следующее:

docker stop container-name
docker rm container-name

Это может не сработать для сценариев, где у вас есть несколько контейнеров с одним и тем же именем (если это возможно), но для моего варианта использования это было идеально.

person Matt Gaunt    schedule 23.03.2016

В моем случае --filter ancestor=<image-name> не работал, поэтому следующая команда очистила контейнер Docker для меня:

docker rm $(docker stop $(docker ps -a -q --filter "name=container_name_here" --format="{{.ID}}"))
person Alexey    schedule 24.02.2017

перечислить все контейнеры с информацией и идентификатором

docker ps

docker stop CONTAINER ID
person Muhammed Moussa    schedule 14.07.2019

Добавляя поверх превосходного ответа @VonC, вот функция ZSH, которую вы можете добавить в свой файл .zshrc:

dockstop() {
  docker rm $(docker stop $(docker ps -a -q --filter ancestor="$1" --format="{{.ID}}"))
}

Затем в командной строке просто выполните dockstop myImageName, и он остановит и удалит все контейнеры, которые были запущены из образа с именем myImageName.

person Antoine Jaussoin    schedule 22.11.2019

используйте: docker container stop $ (docker container ls -q --filter ancestor = mongo)

    (base) :~ user$ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
    d394144acf3a        mongo               "docker-entrypoint.s…"   15 seconds ago      Up 14 seconds       0.0.0.0:27017->27017/tcp   magical_nobel
    (base) :~ user$ docker container stop $(docker container ls -q --filter ancestor=mongo)
    d394144acf3a
    (base) :~ user$ docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    (base) :~ user$
person ASH    schedule 15.02.2020

Это мой сценарий для восстановления контейнера докеров, остановки и повторного запуска.

docker pull [registry]/[image]:latest
docker build --no-cache -t [localregistry]/[localimagename]:latest -f compose.yaml context/
docker ps --no-trunc | grep [localimagename] | awk '{print $1}' | xargs docker stop
docker run -d -p 8111:80 [localregistry]/[localimagename]:latest

примечание - аргумент --no-trunc, который показывает имя изображения или другую информацию в полном объеме в выводе

person Scholtz    schedule 26.12.2020

docker stop $(docker ps -a | grep "zalenium")
docker rm $(docker ps -a | grep "zalenium")

Этого должно хватить.

person Berkay Kırmızıoğlu    schedule 02.05.2019

Если вы хотите предпочесть простой AWK подход, вот мой вариант:

docker rm -f $(docker ps | awk '{ if($2 == "<your image name>") { print $NF}}')

$(docker ps | awk '{ if($2 == "<your image name>") { print $NF}}') - печатает имена контейнеров докеров на основе входного изображения

docker ps - перечислить все контейнеры

awk '{ if($2 == "<your-image-name>") { print $NF}}' - Второй проанализированный столбец docker ps дает имя изображения. Если сравнить его с именем вашего изображения, будет выполнено print $NF, которое напечатает имя контейнера.

docker rm -f удаляет контейнеры

Например, удалить все запущенные контейнеры образа ubuntu можно просто так:

docker rm -f $(docker ps | awk '{ if($2 == "ubuntu:latest") { print $NF}}')

PS: Не забудьте включить тег изображения в AWK, так как это равнозначный компаратор.

person ashutosh    schedule 05.05.2020

Вы можете использовать команду ps, чтобы посмотреть на запущенные контейнеры:

docker ps -a

Оттуда вы должны увидеть имя вашего контейнера вместе с идентификатором контейнера, который вы ищете. Подробнее о docker ps.

person Aaron Tracy    schedule 18.08.2015
comment
Ссылка не работает (К сожалению, мы не можем найти эту страницу). - person Peter Mortensen; 23.07.2018