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
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.
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 comandosapp
de la variable de BASH$app
-
NR>1
salta la primera fila del encabezado desde el comandodocker ps
. -
$(NF) == app
Comparar la última columnaNAMES
es igual a la variable app o no
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
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
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)
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
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
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 )
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