Stoppen von Docker-Containern nach Bildnamen - Ubuntu


155

Unter Ubuntu 14.04 (Trusty Tahr) suche ich nach einer Möglichkeit, einen laufenden Container zu stoppen. Die einzige Information, die ich habe, ist der Image-Name, der im Docker-Befehl run verwendet wurde.

Gibt es einen Befehl, um alle übereinstimmenden laufenden Container zu finden, die diesem Bildnamen entsprechen, und sie zu stoppen?

Antworten:


210

Nach der Ausgabe 8959 wäre ein guter Anfang:

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

Da namesich dies auf den Container und nicht auf den Bildnamen bezieht , müssten Sie den neueren Docker 1.9- Filtervorfahren verwenden , der in der Antwort von koekiebox erwähnt wird .

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

Wie unten von kiril kommentiert , um diese Behälter zu entfernen:

stop gibt auch die Container zurück.

Also verketten stopund rmden Job machen:

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

Das ist toll. Mein Problem danach ist beim Entfernen der Container, da sie sttoped sind, werden sie nicht von Docker pd zurückgegeben. Irgendwelche Hinweise, wie es geht?
Kiril

@ kiril gestoppte Container werden von zurückgegeben ps -a. Entfernte Container ... nun, sie werden entfernt, sie existieren nicht mehr.
VonC

1
Vielen Dank, ich habe nicht bemerkt, dass Stop auch die Container zurückgibt. Verkettungsstopp und rm erledigen also den Job: Docker rm $ (Docker-Stopp $ (Docker ps -a -q --filter = "name = <Bildname>"))
kiril

@kiril Das ist die Idee, ja.
VonC


44

Sie können den Container starten und einen Containernamen festlegen:

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

Das gleiche Bild kann zum Hochfahren mehrerer Container verwendet werden. Dies ist also eine gute Möglichkeit, einen Container zu starten. Dann könnten Sie diesen Containernamen verwenden, um den Container anzuhalten, anzuhängen ...

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

Diese Lösung gefällt mir sehr gut. Gibt es eine bessere Möglichkeit, einen Container zu erstellen, zu stoppen / entfernen und dann auszuführen? sudo docker build . -t <img-name> && sudo docker stop <container-name> || true && sudo docker run -d --rm --name <container-name> <img-name>
Melanke

16

Dieser Code stoppt alle Container mit den Bildschwerpunkten: 6 . Ich konnte keine einfachere Lösung dafür finden.

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

Oder noch kürzer:

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

1
Verbesserungsbedarf :::: Docker Stop $ (Docker ps -a | grep centos: 6 | awk '{print $ 1}')
Shailesh Kumar

@Shaileshkumar Hinzugefügt Ihre Version =)
ArgonQQ

9

Zwei Möglichkeiten, den Betrieb eines Containers zu beenden:

1. $docker stop container_ID

2. $docker kill container_ID

Mit dem folgenden Befehl können Sie Container ausführen:

$docker ps

Folgende Links für weitere Informationen:


Der letzte Link ist defekt ( "Diese Seite kann leider nicht gefunden werden" ).
Peter Mortensen

Ist es buchstäblich $docker? Oder ist $von der Shell-Eingabeaufforderung?
Peter Mortensen

2

Für Docker Version 18.09.0 habe ich festgestellt, dass das Format-Flag nicht benötigt wird

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

2

Stoppen Sie den Docker-Container anhand des Bildnamens:

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

Stoppen Sie den Docker-Container anhand des Bildnamens und des Tags:

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

Wenn Sie das Bild erstellt haben, können Sie ihm eine Beschriftung hinzufügen und laufende Container nach Beschriftung filtern

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

Unzuverlässige Methoden

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

funktioniert nicht immer

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

Filter nach Containername, nicht nach Bildname

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

ist problematisch, da der Bildname möglicherweise in anderen Spalten für andere Bilder angezeigt wird


1

Ich habe ein /usr/local/bin/docker.stopBild erstellt , das den Bildnamen enthält (vorausgesetzt, Sie haben nur ein Bild).

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

1

Ich habe versucht, meine Docker-Befehle in Schluckaufgaben zu verpacken, und festgestellt, dass Sie Folgendes tun können:

docker stop container-name
docker rm container-name

Dies funktioniert möglicherweise nicht für Szenarien, in denen Sie mehrere Container mit demselben Namen haben (falls dies möglich ist), aber für meinen Anwendungsfall war es perfekt.


1

In meinem Fall hat --filter ancestor=<image-name>es nicht funktioniert, daher hat der folgende Befehl den Docker-Container für mich bereinigt:

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

1

Listen Sie alle Container mit Informationen und ID auf

docker ps

docker stop CONTAINER ID

1

Zusätzlich zu der hervorragenden Antwort von @VonC finden Sie hier eine ZSH-Funktion, die Sie Ihrer .zshrc-Datei hinzufügen können:

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

dockstop myImageNameFühren Sie dann in Ihrer Befehlszeile einfach alle Container aus, die von einem Image mit dem Namen myImageName gestartet wurden.



0

benutze: 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

Wenn Sie einen einfachen AWKAnsatz bevorzugen möchten , ist hier meine Meinung :

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

$(docker ps | awk '{ if($2 == "<your image name>") { print $NF}}') - druckt die Docker-Containernamen basierend auf dem Eingabebild

docker ps - Alle Container auflisten

awk '{ if($2 == "<your-image-name>") { print $NF}}'- Die zweite analysierte Spalte von docker psgibt den Bildnamen an. Wenn Sie es mit Ihrem Bildnamen vergleichen, wird ausgeführt, print $NFwodurch der Containername gedruckt wird.

docker rm -f entfernt die Behälter

Das Entfernen aller laufenden Container des Ubuntu-Images kann beispielsweise einfach wie folgt erfolgen:

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

PS: Denken Sie daran, das Bild-Tag in AWK aufzunehmen, da es ein gleichwertiger Komparator ist.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.