Desarrollé una aplicación utilizada como servicio de comunicación para una aplicación web separada. Tuve 0 problemas "acoplando" la aplicación web pero el servicio está demostrando ser una pesadilla. Está basado en JavaFX y el usuario puede establecer una propiedad en el archivo de configuración que hace que la aplicación no inicialice ventanas, menús, contenedores, etc. Este modo "sin cabeza" (no estoy seguro de que sea realmente sin cabeza ...) convierte efectivamente la aplicación de servicio en un servicio en segundo plano. Permítanme también comenzar esto diciendo que la aplicación funciona de manera absolutamente perfecta cuando se ejecuta en mi máquina con Windows 10 y que la he implementado en varias otras máquinas (todas no dockerizadas) sin problemas.
Aquí está el dockerfile que se me ocurrió:
FROM openjdk:13.0.1-slim
RUN apt-get update && apt-get install libgtk-3-0 libglu1-mesa -y && apt-get update
VOLUME /tmp
ADD Some_Service-0.0.1-SNAPSHOT.jar Some_Service-0.0.1-SNAPSHOT.jar
ADD lib lib
ADD config.properties config.properties
ENTRYPOINT ["java", "--module-path", "lib/javafx-sdk-13", "-jar", "Some_Service-0.0.1-SNAPSHOT.jar"]
Luego uso este comando para construir el contenedor:
docker run -t --name Some_Service -e DISPLAY=192.168.1.71:0.0 -e SERVICE_HOME= --link mySQLMD:mysql some_service
Suponiendo que VcXsrv se está ejecutando en mi PC, la aplicación se inicia correctamente, aunque da estas advertencias cuando se inicia por primera vez:
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
Prism-ES2 Error : GL_VERSION (major.minor) = 1.4
El problema es que solo funciona como 2 minutos. Finalmente, el contenedor aparece con este error y se bloquea:
Gdk-Message: 15:28:54.770: java: Fatal IO error 11 (Resource temporarily unavailable) on X server 192.168.1.71:0.0.
Entiendo que los mensajes iniciales se deben a que el contenedor no tiene un controlador NVidia, pero el respaldo a la tubería de software parece funcionar bien. Honestamente, no tengo idea de cuál podría ser el error fatal de IO. He intentado en diferentes hosts con Docker y ocurre el mismo problema.
¿Algúna idea de cómo arreglar esto? Aún mejor, ¿alguna idea de cómo hacer que una aplicación JavaFX sea realmente sin cabeza y ni siquiera requiera que se inicialice nada de esto? Cuando ejecuto sin cabeza, uso Tareas y demás que son parte de JavaFX, así que no puedo simplemente no usarlo ...
-v /tmp/.X11-unix:/tmp/.X11-unix
)? La aplicación que intenta conectarse al Xserver sugiere que no es "sin cabeza", necesitaría revisar la implementación.Respuestas:
Instale xvfb en su contenedor para crear una pantalla virtual. cambiar al archivo Docker:
Agregue un nuevo script bash en su carpeta de proyecto y asígnele el nombre "run.sh"
run.sh:
No te olvides de eliminar
-e DISPLAY=192.168.1.71:0.0
de tu comando Docker Runfuente