Zatrzymywanie kontenerów Docker według nazwy obrazu - Ubuntu


156

W systemie Ubuntu 14.04 (Trusty Tahr) szukam sposobu na zatrzymanie działającego kontenera, a jedyne informacje, które mam, to nazwa obrazu użyta w poleceniu uruchamiania Dockera.

Czy istnieje polecenie, aby znaleźć wszystkie zgodne uruchomione kontenery, które pasują do tej nazwy obrazu, i zatrzymać je?

Odpowiedzi:


210

Po numerze 8959 dobrym początkiem byłoby:

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

Ponieważ nameodnosi się do pojemnika , a nie nazwa obrazu, trzeba by użyć bardziej niedawnego przodka Docker 1,9 filtra , o którym mowa w koekiebox „s odpowiedź .

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

Jak skomentował poniżej Kiril , aby usunąć te pojemniki:

stop zwraca również pojemniki.

Więc łączę stopi rmwykona zadanie:

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

To jest świetne. Mój problem po tym polega na usuwaniu kontenerów, ponieważ są one zatrzymane, nie są zwracane przez docker pd. Jakieś wskazówki, jak to zrobić?
kiril

@kiril zatrzymany kontener są zwracane przez ps -a. Usunięte pojemniki ... no cóż, są usunięte, już nie istnieją.
VonC,

1
Dzięki, nie zdawałem sobie sprawy, że przestań również zwracać pojemniki. Tak więc łączenie stop i rm wykona zadanie: docker rm $ (docker stop $ (docker ps -a -q --filter = "name = <imageName>"))
kiril

@kiril To jest idea, tak.
VonC,


44

Możesz rozpocząć kontener od ustawienia nazwy kontenera:

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

Ten sam obraz może zostać użyty do uruchomienia wielu kontenerów, więc jest to dobry sposób na rozpoczęcie kontenera. Następnie możesz użyć tej nazwy kontenera, aby zatrzymać, dołączyć ... kontener:

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

Bardzo podoba mi się to rozwiązanie. Czy istnieje lepszy sposób tworzenia, zatrzymywania / usuwania, a następnie uruchamiania kontenera niż ten? sudo docker build . -t <img-name> && sudo docker stop <container-name> || true && sudo docker run -d --rm --name <container-name> <img-name>
melanke

16

Ten kod zatrzyma wszystkie kontenery z obrazem centos: 6 . Nie mogłem znaleźć na to prostszego rozwiązania.

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

Albo jeszcze krócej:

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

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

@Shaileshkumar Dodano swoją wersję =)
ArgonQQ

9

Dwa sposoby na zatrzymanie działania kontenera:

1. $docker stop container_ID

2. $docker kill container_ID

Możesz uzyskać uruchomione kontenery za pomocą następującego polecenia:

$docker ps

Poniższe linki zawierają więcej informacji:


Ostatni link jest uszkodzony ( „Przepraszamy, nie możemy znaleźć tej strony” ).
Peter Mortensen

Czy to dosłownie $docker? Czy jest $z zachęty powłoki?
Peter Mortensen

2

W przypadku Dockera w wersji 18.09.0 stwierdziłem, że flaga formatu nie będzie potrzebna

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

2

Zatrzymaj kontener Docker według nazwy obrazu:

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

Zatrzymaj kontener Dockera według nazwy i tagu obrazu:

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

Jeśli utworzyłeś obraz, możesz dodać do niego etykietę i filtrować uruchomione kontenery według etykiety

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

Zawodne metody

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

nie zawsze działa

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

filtruje według nazwy kontenera, a nie nazwy obrazu

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

jest problematyczne, ponieważ nazwa obrazu może pojawić się w innych kolumnach dla innych obrazów


1

Zrobiłem, /usr/local/bin/docker.stopktóry przyjmuje nazwę obrazu (zakładając, że masz tylko jeden uruchomiony).

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

1

Próbowałem zawinąć moje polecenia Dockera w zadania typu łyk i zdałem sobie sprawę, że możesz wykonać następujące czynności:

docker stop container-name
docker rm container-name

To może nie działać w scenariuszach, w których masz wiele kontenerów o tej samej nazwie (jeśli to możliwe), ale w moim przypadku było idealne.


1

W moim przypadku --filter ancestor=<image-name>nie działało, więc następujące polecenie wyczyściło kontener Docker:

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

1

lista wszystkich kontenerów z informacjami i identyfikatorem

docker ps

docker stop CONTAINER ID

1

Dodając do doskonałej odpowiedzi @VonC, oto funkcja ZSH, którą możesz dodać do pliku .zshrc:

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

Następnie w wierszu poleceń po prostu zrób, dockstop myImageNamea zatrzyma i usunie wszystkie kontenery, które zostały uruchomione z obrazu o nazwie myImageName.



0

użyj: 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$

0

Jeśli chcesz preferować proste AWKpodejście, oto moje podejście:

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

$(docker ps | awk '{ if($2 == "<your image name>") { print $NF}}') - drukuje nazwy kontenerów docker na podstawie obrazu wejściowego

docker ps - lista wszystkich kontenerów

awk '{ if($2 == "<your-image-name>") { print $NF}}'- Druga kolumna przeanalizowana docker pszawiera nazwę obrazu. Porównanie go z nazwą obrazu spowoduje print $NFwydrukowanie nazwy kontenera.

docker rm -f usuwa pojemniki

Na przykład usunięcie wszystkich uruchomionych kontenerów obrazu Ubuntu można wykonać w następujący sposób:

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

PS: Pamiętaj, aby dołączyć tag obrazu do AWK, ponieważ jest to równy komparator.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.