Impossible d'exécuter l'application JavaFX sur le docker pendant plus de quelques minutes

9

J'ai développé une application utilisée comme service de communication pour une application web distincte. J'ai rencontré 0 problème de "dockérisation" de l'application Web, mais le service s'avère être un cauchemar. Il est basé sur JavaFX et il y a une propriété qui peut être définie par l'utilisateur dans le fichier de configuration qui fait en sorte que l'application n'initialise pas de fenêtres, menus, conteneurs, etc. Ce mode "sans tête" (pas sûr que ce soit vraiment sans tête ...) transforme efficacement l'application de service en un service d'arrière-plan. Permettez-moi également de préfacer cela en disant que l'application fonctionne parfaitement sans problème lorsqu'elle est exécutée sur ma machine Windows 10 et que je l'ai déployée sur plusieurs autres machines (toutes non dockées) sans aucun problème.

Voici le dockerfile que j'ai créé:

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

J'utilise ensuite cette commande pour construire le conteneur:

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

En supposant que VcXsrv fonctionne sur mon PC, l'application démarre correctement, bien qu'elle donne ces avertissements lors du premier démarrage:

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

Le problème est que cela ne fonctionne que pendant environ 2 minutes. Finalement, le conteneur présente cette erreur et se bloque:

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

Je comprends que les messages initiaux sont dus au fait que le conteneur n'a pas de pilote NVidia mais le retour au pipeline de logiciels semble fonctionner correctement. Honnêtement, je n'ai aucune idée de la cause de l'erreur fatale d'E / S. J'ai essayé différents hôtes exécutant Docker et le même problème se produit.

Une idée de comment résoudre ce problème? Encore mieux, une idée de comment rendre une application JavaFX VRAIMENT sans tête et sans même avoir besoin d'initialiser tout cela? Lors de l'exécution sans tête, j'utilise des tâches et autres qui font partie de JavaFX, donc je ne peux pas simplement ne pas l'utiliser ...

Martin
la source
Avez-vous essayé de monter le serveur hôte Xserver dans l'exécution des conteneurs (c.-à-d. -v /tmp/.X11-unix:/tmp/.X11-unix)? L'application essayant de se connecter au Xserver suggère qu'il n'est pas "sans tête", devrait revoir la mise en œuvre.
masseyb
essayez d'exécuter avec le support 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 cela me donne cette erreur: Réponse d'erreur du démon: impossible de sélectionner le pilote de périphérique "" avec les capacités: [[gpu]]
Martin
@masseyb J'exécute docker sur une machine Windows
Martin

Réponses:

2

Installez xvfb dans votre conteneur pour créer un écran virtuel. passer au fichier 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 

Ajoutez un nouveau script bash dans votre dossier de projet et nommez-le "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

N'oubliez pas de supprimer -e DISPLAY=192.168.1.71:0.0de votre commande docker run

leachim742
la source
Pouvez-vous me montrer comment changer le point d'entrée d'une commande java -jar en une commande contenant à la fois l'instruction java -jar et la commande xvfb?
Martin
J'ai essayé la méthode décrite ici: success.docker.com/article/… . Cela me donne l'erreur suivante: standard_init_linux.go: 211: le processus utilisateur exec a provoqué une "erreur de format exec"
Martin
@Martin j'ai édité ma réponse j'espère que c'est clair maintenant.
leachim742
désolé je ne suis pas encore très bon avec unix :( J'obtiens cette erreur en faisant la commande docker run maintenant: / bin / sh: 1: /run.sh: introuvable
Martin
vous devez créer le fichier 'run.sh' où vos autres fichiers sont stockés comme votre snapshot.jar
leachim742