No se puede ejecutar la aplicación JavaFX en la ventana acoplable durante más de unos minutos

9

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 ...

Martín
fuente
¿Ha intentado montar en enlace los hosts Xserver en el tiempo de ejecución de los contenedores (es decir -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.
masseyb
intente ejecutar con soporte de GPU. "docker run -t --name Some_Service --gpus all -e DISPLAY = 192.168.1.71: 0.0 -e SERVICE_HOME = --link mySQLMD: mysql some_service"
arshpreet
@arshpreet esto me da este error: Respuesta de error del daemon: no se pudo seleccionar el controlador de dispositivo "" con capacidades: [[gpu]]
Martin
@masseyb Estoy ejecutando Docker en una máquina con Windows
Martin

Respuestas:

2

Instale xvfb en su contenedor para crear una pantalla virtual. cambiar al archivo Docker:

FROM openjdk:13.0.1-slim
RUN apt-get update && apt-get install libgtk-3-0 libglu1-mesa xvfb -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
apt-get install xvfb
ENV DISPLAY=:99
ADD run.sh /run.sh
RUN chmod a+x /run.sh
CMD /run.sh 

Agregue un nuevo script bash en su carpeta de proyecto y asígnele el nombre "run.sh"

run.sh:

#!/bin/bash
#remove old 
rm /tmp/.X99-lock #needed when docker container is restarted
Xvfb :99 -screen 0 640x480x8 -nolisten tcp &
java --module-path lib/javafx-sdk-13 -jar Some_Service-0.0.1-SNAPSHOT.jar

No te olvides de eliminar -e DISPLAY=192.168.1.71:0.0de tu comando Docker Run

leachim742
fuente
¿Me puede mostrar cómo cambiar el punto de entrada de un comando java -jar a un comando que contiene tanto la instrucción java -jar como el comando xvfb?
Martin
Probé el método descrito aquí: success.docker.com/article/… . Esto me está dando el siguiente error: standard_init_linux.go: 211: el proceso de usuario exec causó "error de formato exec"
Martin
@ Martin edité mi respuesta, espero que esté claro ahora.
leachim742
lo siento, no soy muy bueno con Unix todavía :( Recibo este error al ejecutar el comando Docker Run ahora: / bin / sh: 1: /run.sh: no encontrado
Martin
debe crear el archivo 'run.sh' donde se almacenan sus otros archivos como snapshot.jar
leachim742