¿Cómo se comunica Docker con los procesos en un contenedor?
Docker asigna al proceso principal de un contenedor el processid1. Este mecanismo controla cuándo el contenedor debe terminar. Para esto, Docker utiliza señales estándar de Linux: primero envía SIGTERM para indicar que el proceso debe finalizar. Si el proceso no responde, después de un tiempo específico, Docker envía SIGKILL para forzar su terminación.
¿Cómo se configuran los scripts en Docker?
En tu proyecto Docker, puedes encontrar un directorio llamado "avanzado" que contiene un subdirectorio "loop". Este incluye dos archivos clave: un Dockerfile y un script de bash. El script de bash es simple; ejecuta un bucle infinito que solo se detiene al recibir la señal SIGTERM. Si recibe dicha señal, sale con éxito usando exit 0.
El Dockerfile configurado con base en Ubuntu, copia este script y lo ejecuta como comando.
¿Cómo construir y ejecutar una imagen con un script de bucle infinito?
Para construir la imagen, usa el comando:
docker build -t loop .
Luego, ejecuta el contenedor de la imagen con:
docker run -d --name looper loop
Este comando ejecuta el contenedor en segundo plano (-d) y le asigna el nombre looper.
¿Cómo detener un contenedor con docker stop?
Al intentar detener el contenedor con docker stop looper, Docker envía SIGTERM, y espera a que el proceso termine. Si después de cierto tiempo no responde, envía SIGKILL. El tiempo de espera suele ser de unos 10 segundos, lo que puede indicar que el contenedor no está respondiendo como esperado.
Para verificar el código de salida del contenedor, usa:
dockerps -l
Una salida de 137 señala un cierre forzado debido a una señal no manejada correctamente.
¿Por qué ocurre el problema de detención tardía?
El problema radica en cómo se lanzó el proceso. El script estaba corriendo como un proceso hijo de un shell, en lugar de ser el proceso principal. En este caso, un shell como /bin/sh no reenvía la señal SIGTERM a sus subprocesos, resultando en problemas de detención.
¿Cómo usar execform para configurar comandos?
Para evitar estos inconvenientes, configura el CMD en el Dockerfile utilizando la forma execform:
CMD ["path/to/script.sh"]
A diferencia de la shellform:
CMD path/to/script.sh
La execform asegura que el script es lanzado directamente como el proceso principal, permitiendo que maneje SIGTERM adecuadamente.
¿Cómo asegurar una salida elegante o graceful shutdown?
Al usar la execform, el proceso puede recibir directamente la señal SIGTERM y realizar una salida ordenada. Verifica que el proceso principal es tu script con:
dockerexec looper ps -ef
Al detener el contenedor con docker stop, observarás un cierre inmediato y confirmación con exit 0.
¿Por qué es crucial elegir el formato correcto?
Usar el formato exec al escribir Dockerfile es esencial para asegurar una adecuada gestión de señales. Esto es vital cuando se opera con múltiples contenedores en ambientes productivos, evitando tiempos de espera innecesarios y garantizando que las aplicaciones se cierran de manera segura y controlada.
Al comprender y aplicar estas prácticas, estarás preparado para enfrentar los desafíos en la gestión de contenedores de manera eficiente, contribuyendo a una infraestructura robusta y eficaz. ¡Sigue explorando estas herramientas para optimizar tus desarrollos y desplegar infraestructuras resilientes!