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


156

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

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

Ответы:


211

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

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

Так как nameотносится к контейнеру, а не к имени изображения, вам нужно будет использовать более свежий предок Docker 1,9 фильтра , упомянутый в koekiebox «s ответ .

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

Как прокомментировал Кирилл ниже , чтобы удалить эти контейнеры:

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

Так что приковать stopи rmсделаем всю работу

docker rm $(docker stop $(docker ps -a -q --filter ancestor=<image-name> --format="{{.ID}}"))

Это круто. Моя проблема после этого заключается в удалении контейнеров, так как они не работают, они не возвращаются docker pd. Любые подсказки, как это сделать?
Кирил

@kiril остановленный контейнер возвращен ps -a. Удаленные контейнеры ... хорошо, они удалены, они больше не существуют.
VonC

1
Спасибо, я не осознавал, что Stop также возвращает контейнеры. Поэтому цепочка stop и rm выполнят эту работу: docker rm $ (docker stop $ (docker ps -a -q --filter = "name = <imageName>"))
кирил

@kiril Это идея, да.
VonC


44

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

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

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

docker exec -it <container-name> bash
docker stop <container-name>
docker rm <container-name>

Мне очень нравится это решение. Есть ли лучший способ создать, остановить / удалить, а затем запустить контейнер, чем этот? sudo docker build . -t <img-name> && sudo docker stop <container-name> || true && sudo docker run -d --rm --name <container-name> <img-name>
Меланке

16

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

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

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

docker stop $(docker ps -a | grep centos:6 | awk '{print $1}')

1
нуждается в улучшении :::: docker stop $ (docker ps -a | grep centos: 6 | awk '{print $ 1}')
Шайлеш Кумар

@Shaileshkumar Добавил вашу версию =)
ArgonQQ

9

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

1. $docker stop container_ID

2. $docker kill container_ID

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

$docker ps

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


Последняя ссылка не работает ( «Извините, мы не можем найти эту страницу» ).
Питер Мортенсен

Это буквально $docker? Или это $из командной строки?
Питер Мортенсен

2

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

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

2

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

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}'

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


1

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

docker stop $(docker ps -q -f "name=$1")

1

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

docker stop container-name
docker rm container-name

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


1

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

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


1

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

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

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



0

использование: остановка контейнера Docker $ (контейнер докера 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$

0

Если вы хотите предпочесть простой 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, так как это равный компаратор.


-5

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

docker ps -a

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


Ссылка не работает ( извините, мы не можем найти эту страницу ).
Питер Мортенсен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.