detener y eliminar contenedor docker si se está ejecutando


Estoy buscando detener y eliminar pragmáticamente un contenedor docker si se está ejecutando. Esto es para un script de compilación.

Tomemos el siguiente ejemplo. ¿Cómo puedo detener y eliminar el contenedor docker "rabbitmq" como se ve en la columna NOMBRES en un script bash.

docker ps

CONTAINER ID        IMAGE             COMMAND                  CREATED             STATUS              PORTS                   NAMES
9909a5e2856f        rabbitmq-image   "/docker-entrypoint.s"   11 minutes ago      Up 11 minutes       0.0.0.0:5672->5672/tcp, rabbitmq
8990dd1fe503        redis-image      "/entrypoint.sh redis"   6 weeks ago         Up 4 days           0.0.0.0:32770->6379/tcp redis
etc 

El siguiente comando eliminará el contenedor y hará lo que estoy buscando hacer

docker stop rabbitmq && docker rm -f rabbitmq

Sin embargo, su peinado en un guión que me gustaría saber?Creo que se vería algo como esto.

#!/bin/bash

if [ /*docker ps check some value */ ]; then
   docker stop rabbitmq && docker rm -f rabbitmq
fi
Author: Robbo_UK, 2015-12-11

8 answers

Como probablemente haya notado, docker stop y docker rm salen con un código de estado que indica un error si el contenedor no existe o no se está ejecutando. Esto resulta en que su construcción falle.

Si puede hacer frente a los mensajes de error en su registro de compilación, puede hacer este pequeño truco para evitar que el comando shell falle:

docker stop rabbitmq || true && docker rm rabbitmq || true

En el caso de que uno de los comandos de docker falle, se llama a true que siempre sale con un código de estado que indica éxito.

 75
Author: Johannes Barop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-06 13:31:07

Puedes usar:

app="rabbitmq"
if docker ps | awk -v app="$app" 'NR > 1 && $NF == app{ret=1; exit} END{exit !ret}'; then
  docker stop "$app" && docker rm -f "$app"
fi
  • awk el comando obtiene un var de línea de comandos app de la variable de BASH $app
  • NR>1 salta la primera fila del encabezado desde el comando docker ps.
  • $(NF) == app Comparar la última columna NAMES es igual a la variable app o no
 10
Author: anubhava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-02 20:47:10

Tengo un problema similar, pero no me gustó la respuesta aceptada, ya que suprime todos los errores de los comandos, en lugar de solo el error "no encontrado".

Sin embargo, docker ps -q --filter "name=rabbitmq" solo produce salida si un contenedor de ese nombre realmente existe, por lo que inspirado por Prueba si un comando produce una cadena vacía Se me ocurrió:

docker ps -q --filter "name=rabbitmq" | grep -q . && docker stop rabbitmq && docker rm -fv rabbitmq

El siguiente comando también es útil para probar definiciones de filtros:

docker ps -q --filter "name=rabbitmq" | grep -q . && echo Found || echo Not Found

Mi caso de uso real fue definir un par de Tareas Ansible que eliminaron todos los contenedores existentes actualmente (ya sea que se ejecuten o no) de una lista de nombres generados en una tarea anterior:

- name: Check for containers that actually exist
  shell: 'docker ps -aq --filter "name={{ item }}"'
  with_items:
    - '{{ previous_command.stdout_lines }}'
  register: found_containers

- name: Remove the containers found by the above command
  shell: 'docker stop {{ item.item }} && docker rm -fv {{ item.item }}'
  with_items: '{{ found_containers.results }}'
  when: item.stdout
 9
Author: ncoghlan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-05 09:17:51

Ha estado usando docker durante un tiempo más. Esta es mi forma preferida de detener y eliminar un contenedor docker.

docker rm -f || true
 4
Author: Robbo_UK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-22 10:51:22

Para detener todos los contenedores primero debe detener todos los contenedores con

docker kill $(docker ps -q)

Y eliminar todos los contenedores

docker rm $(docker ps -a -q)

Y si desea eliminar todas las imágenes este es el comando

docker rmi $(docker images -q)
 1
Author: Gustavo Muñoz Valenzuela,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-20 12:30:29
# Stop the running "rabbitmq" container if there is one
CONTAINER_NAME="rabbitmq"
OLD="$(docker ps --all --quiet --filter=name="$CONTAINER_NAME")"
if [ -n "$OLD" ]; then
  docker stop $OLD && docker rm $OLD
fi
 1
Author: iver56,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-07 12:06:21

Copie este código en su script.sh si quieres stop y remove todos

#!/bin/sh
ids=$(docker ps -a -q)
for id in $ids
do
  echo "$id"
  docker stop $id && docker rm $id
done
 0
Author: Alex Montoya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-01 01:34:56

Si no elimina sus contenedores detenidos, otra forma sencilla de resolver esto es confiar en docker ps -a, que siempre devolverá ese id de contenedor. Luego ejecutar docker stop en ese contenedor detenido simplemente no hará nada:

docker stop $(docker ps -a --filter name= rabbitmq -q )

 0
Author: Svend,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-05 10:49:22