Зупинка контейнерів Docker за назвою зображення - Ubuntu


156

У Ubuntu 14.04 (Trusty Tahr) я шукаю спосіб зупинити запущений контейнер, і єдина інформація, яку я маю - це ім'я зображення, яке було використано в команді Docker run.

Чи є команда знайти всі відповідні запущені контейнери, які відповідають цьому імені зображення, і зупинити їх?

Відповіді:


210

Після випуску 8959 хорошим початком буде:

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

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

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}}"))

Це чудово. Моя проблема після цього полягає у видаленні контейнерів, оскільки вони розміщені, вони не повертаються docker pd. Будь-які підказки, як це зробити?
Кіріл

@kiril зупинений контейнер повертається ps -a. Вилучені контейнери ... ну їх видаляють, їх уже не існує.
VonC

1
Дякую, я також не розумів, що зупинка повертає контейнери. Отже, ланцюг зупинки і rm виконають роботу: docker rm $ (docker stop $ (docker ps -a -q --filter = "name = <imageName>"))
kiril

@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>
melanke

16

Цей код зупинить усі контейнери із центром зображення : 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

використання: докер-контейнер стоп $ (докер-контейнер ls -q --filter predastor = 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.