
Tengo un contenedor acoplable que ejecuta CentOS 7.
Está ejecutando un script wrapper_script.sh
como PID 1. También se encuentra a continuación en la ventana acoplable de redacción.
CMD ["/wrapper_script.sh"]
Lo probé docker stop
en 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.sh
es 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 stop
comando, 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 stop
tarda más de 10 segundos en regresar, esto significa que su contenedor no respondió dentro de este tiempo.
El docker stop
comando 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.