Estoy buscando detener y eliminar pragmáticamente un contenedor docker si se está ejecutando. Esto es para un script de construcción.
Tome el siguiente ejemplo. ¿Cómo detendría y eliminaría el contenedor docker "rabbitmq" como se ve en la columna NAMES 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 hace lo que estoy buscando hacer
docker stop rabbitmq && docker rm -f rabbitmq
Sin embargo, ¿lo está combinando en un guión que me gustaría saber? Creo que se vería así.
#!/bin/bash
if [ /*docker ps check some value */ ]; then
docker stop rabbitmq && docker rm -f rabbitmq
fi
fuente
Error response from daemon: no such id: rabbitmq
cuando el contenedor ya se haya eliminado.Tengo un problema similar, pero no me gustó la respuesta aceptada, ya que suprime todos los errores de los comandos, en lugar del error "no encontrado".
Sin embargo,
docker ps -q --filter "name=rabbitmq"
solo produce salida si realmente existe un contenedor con ese nombre, así que inspirado por Test si un comando genera una cadena vacía que 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 de Ansible que eliminaron todos los contenedores existentes actualmente (ya sea que se estén ejecutando o no) de una lista de nombres generada 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
fuente
docker ps -aq ...
. La-a
opción significa que también encontrará contenedores que existen pero que no se están ejecutando actualmente.ps -aq
También se usa , como sugiere @PeterBloomfield.grep -q .
también tiene un código de existencia distinto de cero y, por lo tanto, toda su línea. Entonces esto todavía resulta en un error. Lo que me obligaría a agregar|| echo 'not found'
o algo así. Y en ese punto no hay mucha diferencia con la respuesta aceptadaif docker ps -q --filter "name=rabbitmq" | grep -q .; then docker stop rabbitmq && docker rm -fv rabbitmq; fi
He estado usando Docker por un tiempo más. Esta es mi forma preferida de detener y eliminar un contenedor docker. La canalización de la verdad está ahí para garantizar que siempre tenga éxito. Sin él, cualquier script bash se cerraría y produciría un error si el nombre del contenedor no existiera.
docker rm -f container_name || true
fuente
docker rm -f container_name &>/dev/null && echo 'Removed old container'
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
comando obtiene una línea de comando varapp
de la variable de BASH$app
NR>1
omite la primera fila de encabezado deldocker ps
comando.$(NF) == app
Comparar la última columnaNAMES
es igual a la variable de la aplicación o nofuente
# Stop and remove containers with names like "rabbitmq" and "rabbitmq123" if they exist CONTAINER_NAME="rabbitmq" OLD="$(docker ps --all --quiet --filter=name="$CONTAINER_NAME")" if [ -n "$OLD" ]; then docker stop $OLD && docker rm $OLD fi
fuente
Sugiero este encantamiento en bash:
( docker stop $CONTAINER > /dev/null && echo Stopped container $CONTAINER && \ docker rm $CONTAINER ) 2>/dev/null || true
Siempre sale con 0, no se queja si el contenedor no se está ejecutando e imprime
Stopped container $CONTAINER
si realmente se detuvo.fuente
stop
/rm
el contenedor si se encuentra.Un formulario general basado en algunas respuestas aquí:
docker rm -f container_name > /dev/null 2>&1 && echo 'removed container' || echo 'nothing to remove'
fuente
Copie este código en su script.sh si lo desea
stop
yremove
todo#!/bin/sh ids=$(docker ps -a -q) for id in $ids do echo "$id" docker stop $id && docker rm $id done
fuente
Si no elimina sus contenedores detenidos, otra forma sencilla de abordar esto es confiar en
docker ps -a
, que siempre devolverá ese ID de contenedor. Luego, ejecutardocker stop
en ese contenedor detenido idempotentemente simplemente no hará nada:docker stop $(docker ps -a --filter name= rabbitmq -q )
fuente
Para detener todos los contenedores primero, debe detener todos los contenedores con
docker kill $(docker ps -q)
y borrar todos los contenedores
y si quieres borrar todas las imágenes este es el comando
fuente