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 ...
-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.Réponses:
Installez xvfb dans votre conteneur pour créer un écran virtuel. passer au fichier Docker:
Ajoutez un nouveau script bash dans votre dossier de projet et nommez-le "run.sh"
run.sh:
N'oubliez pas de supprimer
-e DISPLAY=192.168.1.71:0.0
de votre commande docker runla source