Tengo una máquina host que tiene un contenedor docker. El contenedor está activo y ejecuta un servicio en particular. Al cumplir con una condición particular, quiero quitar el contenedor y apagar la máquina también. ¿Es posible hacerlo? ¿Estoy planeando modificar el código que ejecuta el servicio para manejar el apagado de la máquina? ¡Cualquier sugerencia es bienvenida!
La ejecución de un apagado limpio dependerá del sistema de inicio del host.
Para evitar otorgarle al contenedor acceso --privileged y también para evitar instalar herramientas de inicio específicas del host en su contenedor, puede crear una interfaz para indicarle al host que se apague en lugar de intentar que el contenedor ejecute el apagado.
Hay muchas maneras de hacer esto. Un punto de partida simple podría ser un volumen montado para compartir datos entre el contenedor y el host. Un archivo servirá por ahora, pero puede usar un socket, fifo, TCP o cualquier otro método IPC que desee.
Cree un archivo en el host, diga /var/run/shutdown_signal y monte el archivo en su contenedor
docker run -d -v /var/run/shutdown_signal:/shutdown_signal whateverEscriba una cadena en el archivo cuando desee que el host se apague
docker exec $cid sh -c 'echo true > /shutdown_signal'Entonces necesita algo ejecutándose en el host para monitorear el archivo.
Un script simple que espera cambios en el archivo con inotifywait .
echo "waiting" > /var/run/shutdown_signal while inotifywait -e close_write /var/run/shutdown_signal; do signal=$(cat /var/run/shutdown_signal) if [ "$signal" == "true" ]; then echo "done" > /var/run/shutdown_signal shutdown -h now fi done Puede sondear el archivo si inotifywait no está disponible.
while sleep 30; do signal=$(cat /var/run/shutdown_signal) ...También hay una forma de kernel más universal para activar un apagado inmediato y sucio en Linux.
docker run --privileged busybox \ sh -c 'echo 1 > /proc/sys/kernel/sysrq; echo o > /proc/sysrq-trigger'Pero esto probablemente le causará más problemas de los que vale la pena.