Impossibile eseguire l'app JavaFX sulla finestra mobile per più di qualche minuto


9

Ho sviluppato un'applicazione utilizzata come servizio di comunicazione per un'app Web separata. Ho avuto 0 problemi a "dockerizzare" l'app Web ma il servizio si sta rivelando un incubo. Si basa su JavaFX e c'è una proprietà che può essere impostata dall'utente nel file di configurazione che lo rende in modo che l'app non inizializzi finestre, menu, contenitori, ecc. Questa modalità "senza testa" (non sono sicuro che sia veramente senza testa ...) trasforma efficacemente l'app di servizio in un servizio in background. Consentitemi di prefigurare anche questo dicendo che l'app funziona perfettamente senza problemi quando viene eseguita sul mio computer Windows 10 e che l'ho distribuita su molti altri computer (tutti non ancorati) senza problemi.

Ecco il file docker che ho creato:

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"]

Quindi uso questo comando per creare il contenitore:

docker run -t --name Some_Service -e DISPLAY=192.168.1.71:0.0 -e SERVICE_HOME= --link mySQLMD:mysql some_service

Supponendo che VcXsrv sia in esecuzione sul mio PC, l'app si avvia correttamente, sebbene fornisca questi avvisi al primo avvio:

libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
Prism-ES2 Error : GL_VERSION (major.minor) = 1.4

Il problema è che funziona solo per circa 2 minuti. Alla fine il contenitore presenta questo errore e si arresta in modo anomalo:

Gdk-Message: 15:28:54.770: java: Fatal IO error 11 (Resource temporarily unavailable) on X server 192.168.1.71:0.0.

Capisco che i messaggi iniziali sono dovuti al fatto che il contenitore non ha driver NVidia ma il fallback alla pipeline del software sembra funzionare bene. Onestamente non ho idea di quale potrebbe essere l'errore fatale IO. Ho provato su diversi host che eseguono docker e si verifica lo stesso problema.

Qualche idea su come risolvere questo problema? Ancora meglio, hai idea di come rendere un'app JavaFX VERAMENTE senza testa e di non richiedere nemmeno l'inizializzazione di queste cose? Quando corro senza testa, utilizzo Task e simili che fanno parte di JavaFX, quindi non posso proprio non usarlo ...


Hai provato a eseguire il bind di montaggio degli host Xserver nel runtime dei container (ad es. -v /tmp/.X11-unix:/tmp/.X11-unix)? L'app che tenta di collegarsi a Xserver suggerisce che non è "senza testa", dovrebbe rivedere l'implementazione.
masseyb,

prova a eseguire con il supporto 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 questo mi dà questo errore: Risposta di errore dal demone: impossibile selezionare il driver di dispositivo "" con funzionalità: [[gpu]]
Martin

@masseyb Sto eseguendo una finestra mobile su un computer Windows
Martin

Risposte:


2

Installa xvfb nel tuo contenitore per creare uno schermo virtuale. passare al file 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 

Aggiungi il nuovo script bash nella cartella del tuo progetto e chiamalo "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

Non dimenticare di rimuovere -e DISPLAY=192.168.1.71:0.0dal comando Esegui finestra mobile


Potete mostrarmi come cambiare il punto di ingresso da un comando java -jar a un comando contenente sia l'istruzione java -jar che il comando xvfb?
Martin,

Ho provato il metodo descritto qui: success.docker.com/article/… . Questo mi sta dando il seguente errore: standard_init_linux.go: 211: processo utente exec causato "errore formato exec"
Martin

@Martin ho modificato la mia risposta, spero sia chiaro ora.
leachim742

scusa non sono ancora bravo con unix :( Ricevo questo errore quando eseguo il comando docker run ora: / bin / sh: 1: /run.sh: non trovato
Martin

devi creare il file 'run.sh' dove sono archiviati gli altri tuoi file come il tuo snapshot.jar
leachim742
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.