Arrêter les conteneurs Docker par nom d'image - Ubuntu

156

Sur Ubuntu 14.04 (Trusty Tahr), je cherche un moyen d'arrêter un conteneur en cours d'exécution et la seule information dont je dispose est le nom de l'image qui a été utilisé dans la commande d'exécution de Docker.

Existe-t-il une commande pour trouver tous les conteneurs en cours d'exécution correspondants qui correspondent à ce nom d'image et les arrêter?

Collin Estes
la source

Réponses:

211

Suite au numéro 8959 , un bon début serait:

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

Puisque namefait référence au conteneur et non au nom de l'image, vous devrez utiliser le plus récent ancêtre du filtre Docker 1.9 , mentionné dans la réponse de koekiebox .

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

Comme commenté ci-dessous par Kiril , pour supprimer ces conteneurs:

stop renvoie également les conteneurs.

Donc enchaîner stopet rmfera le travail:

docker rm $(docker stop $(docker ps -a -q --filter ancestor=<image-name> --format="{{.ID}}"))
VonC
la source
C'est bien. Mon problème après cela est lors de la suppression des conteneurs, puisqu'ils sont sttoped, ils ne sont pas retournés par docker pd. Des indices sur la façon de le faire?
kiril du
Les conteneurs arrêtés @kiril sont renvoyés par ps -a. Conteneurs supprimés ... eh bien ils sont supprimés, ils n'existent plus.
VonC
1
Merci, je ne me suis pas rendu compte non plus du retour des conteneurs. Ainsi, le chaînage stop et rm fera l'affaire: docker rm $ (docker stop $ (docker ps -a -q --filter = "name = <imageName>"))
kiril
@kiril C'est l'idée, oui.
VonC du
63

Les réponses précédentes n'ont pas fonctionné pour moi, mais cela a fonctionné:

docker stop $(docker ps -q --filter ancestor=<image-name> )
Koekiebox
la source
1
Utilisation intéressante de l'ancêtre là-bas ( docs.docker.com/engine/reference/commandline/ps/#filtering ). +1
VonC
1
Fonctionne également sur Docker Terminal pour Windows.
Koekiebox le
44

Vous pouvez démarrer le conteneur en définissant un nom de conteneur:

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

La même image peut être utilisée pour faire tourner plusieurs conteneurs, c'est donc un bon moyen de démarrer un conteneur. Ensuite, vous pouvez utiliser ce nom de conteneur pour arrêter, attacher ... le conteneur:

docker exec -it <container-name> bash
docker stop <container-name>
docker rm <container-name>
Javier Sánchez
la source
J'aime vraiment cette solution. Existe-t-il un meilleur moyen de créer, d'arrêter / de supprimer puis d'exécuter un conteneur que celui-ci? sudo docker build . -t <img-name> && sudo docker stop <container-name> || true && sudo docker run -d --rm --name <container-name> <img-name>
melanke
16

Ce code arrêtera tous les conteneurs avec l'image centos: 6 . Je n'ai pas pu trouver de solution plus simple à cela.

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

Ou encore plus court:

docker stop $(docker ps -a | grep centos:6 | awk '{print $1}')
ArgonQQ
la source
1
besoin d'amélioration :::: docker stop $ (docker ps -a | grep centos: 6 | awk '{print $ 1}')
Shailesh kumar
@Shaileshkumar a ajouté votre version =)
ArgonQQ
9

Deux façons d'arrêter d'exécuter un conteneur:

1. $docker stop container_ID

2. $docker kill container_ID

Vous pouvez obtenir des conteneurs en cours d'exécution à l'aide de la commande suivante:

$docker ps

Liens suivants pour plus d'informations:

kalyani chaudhari
la source
Le dernier lien est rompu ( "Désolé, nous ne pouvons pas trouver cette page" ).
Peter Mortensen
Est-ce littéralement $docker? Ou vient $de l'invite du shell?
Peter Mortensen
2

Pour la version 18.09.0 de Docker, j'ai trouvé que l'indicateur de format n'était pas nécessaire

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

Arrêtez le conteneur Docker par nom d'image:

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

Arrêtez le conteneur Docker par nom d'image et tag:

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

Si vous avez créé l'image, vous pouvez y ajouter une étiquette et filtrer les conteneurs en cours d'exécution par étiquette

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

Méthodes peu fiables

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

ne fonctionne pas toujours

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

filtre par nom de conteneur, pas par nom d'image

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

est problématique car le nom de l'image peut apparaître dans d'autres colonnes pour d'autres images

Geai
la source
1

J'ai fait un /usr/local/bin/docker.stopqui prend le nom de l'image (en supposant que vous n'en avez qu'un en cours d'exécution).

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

J'essayais d'encapsuler mes commandes Docker dans des tâches gulp et j'ai réalisé que vous pouviez effectuer les opérations suivantes:

docker stop container-name
docker rm container-name

Cela pourrait ne pas fonctionner pour les scénarios où vous avez plusieurs conteneurs avec le même nom (si c'est possible), mais pour mon cas d'utilisation, c'était parfait.

Matt Gaunt
la source
1

Dans mon cas --filter ancestor=<image-name>ne fonctionnait pas, donc la commande suivante a nettoyé le conteneur Docker pour moi:

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

lister tous les conteneurs avec informations et ID

docker ps

docker stop CONTAINER ID
Muhammed Moussa
la source
1

En plus de la superbe réponse @VonC, voici une fonction ZSH que vous pouvez ajouter dans votre fichier .zshrc:

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

Ensuite, dans votre ligne de commande, faites simplement dockstop myImageNameet il s'arrêtera et supprimera tous les conteneurs qui ont été démarrés à partir d'une image appelée myImageName.

Antoine Jaussoin
la source
0
docker stop $(docker ps -a | grep "zalenium")
docker rm $(docker ps -a | grep "zalenium")

Cela devrait suffire.

Berkay Kırmızıoğlu
la source
0

utiliser: 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$
CENDRE
la source
0

Si vous souhaitez préférer une AWKapproche simple , voici mon avis:

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

$(docker ps | awk '{ if($2 == "<your image name>") { print $NF}}') - imprime les noms des conteneurs du docker en fonction de l'image d'entrée

docker ps - lister tous les conteneurs

awk '{ if($2 == "<your-image-name>") { print $NF}}'- La deuxième colonne analysée de docker psdonne le nom de l'image. Le comparer avec le nom de votre image exécutera print $NFce qui imprime le nom du conteneur.

docker rm -f supprime les conteneurs

Par exemple, la suppression de tous les conteneurs en cours d'exécution de l'image ubuntu peut être effectuée simplement comme suit:

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

PS: n'oubliez pas d'inclure la balise image dans AWK, car c'est un comparateur égal.

ashutosh
la source
-5

Vous pouvez utiliser la pscommande pour jeter un œil aux conteneurs en cours d'exécution:

docker ps -a

De là, vous devriez voir le nom de votre conteneur ainsi que l'ID de conteneur que vous recherchez. Voici plus d'informations surdocker ps .

Aaron Tracy
la source
Le lien est rompu ( Désolé, nous ne pouvons pas trouver cette page ).
Peter Mortensen