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?

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

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


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>

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

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:


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

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


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

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.


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

1

lister tous les conteneurs avec informations et ID

docker ps

docker stop CONTAINER ID

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.



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$

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.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.