Tengo tomcat ejecutándose como servicio docker en un enjambre. Cuando el servicio se inicia, carga una gran cantidad de datos en la memoria, lo que puede demorar, según la cantidad de datos, entre 10 y 30 minutos.
Mi problema es cuando actualizo el servicio (pedido: comenzar primero), el contenedor anterior se detiene antes de que el nuevo contenedor haya inicializado sus datos y, por lo tanto, no esté listo para usar.
Un enfoque prometedor me pareció la configuración de verificación de estado en mi docker-compose:
healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/areyouready"] interval: 10s timeout: 10s retries: 30La verificación de estado funciona bien, pero el servicio anterior también se cierra mientras que la prueba devuelve 1 (no es saludable) para el nuevo servicio.
También traté de manejar el SIGTERM en mi aplicación: el servicio en ejecución obtiene el sigterm y verifica si ya debería detenerse según el estado del nuevo servicio:
Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { // via db access determine the state of the new started containers, but I don't know // how to prevent my tomcat from stopping here } }Además de eso, no logré evitar que mi gato lo detuviera, simplemente no parecía ser la forma correcta.
Mi solución deseada sería configurar algo como esto:
update_config: order: start-first a-kind-of-stop-condition: ["CMD", "curl", "-f", "http://localhost:8080/areyouready"]la solicitud de condición debe ir al nuevo contenedor creado y, si tiene éxito, se puede detener el anterior.
Sería genial si pudiera señalarme en la dirección correcta.
Saludos cordiales, Sebastián