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 ...
-v /tmp/.X11-unix:/tmp/.X11-unix
)? L'app che tenta di collegarsi a Xserver suggerisce che non è "senza testa", dovrebbe rivedere l'implementazione.