Detener los contenedores Docker por nombre de imagen - Ubuntu


156

En Ubuntu 14.04 (Trusty Tahr), estoy buscando una manera de detener un contenedor en ejecución y la única información que tengo es el nombre de la imagen que se utilizó en el comando de ejecución de Docker.

¿Existe un comando para encontrar todos los contenedores en ejecución coincidentes que coincidan con ese nombre de imagen y detenerlos?

Respuestas:


210

Después del número 8959 , un buen comienzo sería:

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

Como se namerefiere al contenedor y no al nombre de la imagen, necesitaría usar el ancestro del filtro Docker 1.9 más reciente , mencionado en la respuesta de koekiebox .

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

Como se comenta a continuación por Kiril , para eliminar esos contenedores:

stop devuelve los contenedores también.

Así encadenando stopy rmharemos el trabajo:

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

Esto es genial. Mi problema después de eso es cuando quito los contenedores, ya que están detenidos, docker pd no los devuelve. ¿Alguna pista de cómo hacerlo?
kiril

@kiril contenedor detenido son devueltos por ps -a. Contenedores eliminados ... bueno, se eliminan, ya no existen.
VonC

1
Gracias, no me di cuenta de que stop devuelve los contenedores también. Así que encadenar stop y rm hará el trabajo: docker rm $ (docker stop $ (docker ps -a -q --filter = "name = <imageName>"))
kiril

@kiril Esa es la idea, sí.
VonC


44

Puede iniciar el contenedor configurando un nombre de contenedor:

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

La misma imagen podría usarse para girar varios contenedores, por lo que esta es una buena manera de iniciar un contenedor. Entonces podría usar este nombre de contenedor para detener, adjuntar ... el contenedor:

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

Realmente me gusta esta solución. ¿Hay una mejor manera de construir, detener / eliminar y luego ejecutar un contenedor que este? sudo docker build . -t <img-name> && sudo docker stop <container-name> || true && sudo docker run -d --rm --name <container-name> <img-name>
melanke

16

Este código detendrá todos los contenedores con los centos de imagen : 6 . No pude encontrar una solución más fácil para eso.

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

O incluso más corto:

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

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

@Shaileshkumar Agregó su versión =)
ArgonQQ

9

Dos formas de dejar de ejecutar un contenedor:

1. $docker stop container_ID

2. $docker kill container_ID

Puede ejecutar contenedores con el siguiente comando:

$docker ps

Siguientes enlaces para más información:


El último enlace está roto ( "Lo sentimos, no podemos encontrar esa página" ).
Peter Mortensen

¿Es literalmente $docker? ¿O es $desde el indicador de comandos de shell?
Peter Mortensen

2

Para Docker versión 18.09.0, descubrí que no se necesitará la marca de formato

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

2

Detener el contenedor acoplable por nombre de imagen:

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

Detenga el contenedor acoplable por nombre de imagen y etiqueta:

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

Si creó la imagen, puede agregarle una etiqueta y filtrar los contenedores en ejecución por etiqueta

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

Métodos poco confiables

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

no siempre funciona

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

filtra por nombre del contenedor, no por nombre de imagen

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

es problemático ya que el nombre de la imagen puede aparecer en otras columnas para otras imágenes


1

Hice una /usr/local/bin/docker.stopque toma el nombre de la imagen (se supone que solo tiene una en ejecución).

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

1

Intenté ajustar mis comandos de Docker en tareas de trago y me di cuenta de que puede hacer lo siguiente:

docker stop container-name
docker rm container-name

Esto podría no funcionar para escenarios en los que tiene varios contenedores con el mismo nombre (si es posible), pero para mi caso de uso fue perfecto.


1

En mi caso --filter ancestor=<image-name>no funcionaba, por lo que el siguiente comando limpió el contenedor Docker para mí:

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

1

enumerar todos los contenedores con información e identificación

docker ps

docker stop CONTAINER ID

1

Agregando además de la excelente respuesta de @VonC, aquí hay una función ZSH que puede agregar a su archivo .zshrc:

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

Luego, en su línea de comando, simplemente haga dockstop myImageNamey se detendrá y eliminará todos los contenedores que se iniciaron desde una imagen llamada myImageName.


0
docker stop $(docker ps -a | grep "zalenium")
docker rm $(docker ps -a | grep "zalenium")

Esto debería ser suficiente.


0

use: contenedor Docker stop $ (contenedor Docker 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 desea preferir un AWKenfoque simple , aquí está mi opinión:

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

$(docker ps | awk '{ if($2 == "<your image name>") { print $NF}}') - imprime los nombres del contenedor acoplable en función de la imagen de entrada

docker ps - enumerar todos los contenedores

awk '{ if($2 == "<your-image-name>") { print $NF}}'- La segunda columna analizada de docker psda el nombre de la imagen. Comparándolo con el nombre de su imagen se ejecutará lo print $NFque imprime el nombre del contenedor.

docker rm -f elimina los contenedores

Por ejemplo, la eliminación de todos los contenedores en ejecución de la imagen de ubuntu se puede hacer simplemente como:

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

PD: Recuerde incluir la etiqueta de imagen en AWK, ya que es un comparador igual.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.