Cómo cerrar con gracia un contenedor Docker

Cómo cerrar con gracia un contenedor Docker

Tengo un contenedor acoplable que ejecuta CentOS 7.

Está ejecutando un script wrapper_script.shcomo PID 1. También se encuentra a continuación en la ventana acoplable de redacción.

CMD ["/wrapper_script.sh"]

Lo probé docker stopen el contenedor. No está ejecutando la función de limpieza. Está deteniendo directamente el contenedor.

Intentó docker kill --signal="SIGTERM" <containername>. Tampoco está ejecutando la función de limpieza. También tenga en cuenta que esto no significa matar/detener el contenedor en sí.

Por favor ayuda para solucionar este problema. Se agradece cualquier sugerencia.

wrapper_script.shes el siguiente:

#!/usr/bin/env bash
cleanup() {
    echo "Cleaning up..."
    /wrapper-script-stop.sh
}
trap 'cleanup' SIGTERM EXIT
/run-something.sh
while sleep 60; do
  ps aux |grep run-something.sh |grep -q -v grep
  PROCESS_1_STATUS=$?
  if [ $PROCESS_1_STATUS -ne 0 ]; then
    echo "One of the processes has already exited."
    exit 1
  fi
done

Respuesta1

No entiendo la conexión entre el script bash y la pregunta, pero aquí hay información sobre cómo detener un contenedor.

Cuando emite un docker stopcomando, Docker primero le pedirá amablemente que se detenga el proceso y, si no lo cumple dentro de los 10 segundos predeterminados, lo finalizará por la fuerza. Si docker stoptarda más de 10 segundos en regresar, esto significa que su contenedor no respondió dentro de este tiempo.

El docker stopcomando intenta detener primero un contenedor en ejecución enviando una señal SIGTERM al proceso raíz (PID 1) en el contenedor. Si el proceso no sale dentro de este tiempo de espera, se enviará una señal SIGKILL.

Es posible que su proceso elija ignorar la señal SIGTERM, pero no puede ignorar un SIGKILL. Después de emitir SIGKILL, el proceso ni siquiera verá la señal, por lo que no podrá realizar ninguna acción de limpieza.

Puede controlar la cantidad de segundos que el demonio Docker esperará antes de enviar SIGKILL. Si su proceso necesita más tiempo para finalizar, puede usar un comando como:

docker stop --time=30 mycontainer

Si el proceso se bloquea, debe averiguar por qué, si es absolutamente necesario que finalice correctamente para que se realice esta acción de limpieza.

información relacionada