Die JavaFX-App kann nicht länger als einige Minuten auf Docker ausgeführt werden

9

Ich habe eine Anwendung entwickelt, die als Kommunikationsdienst für eine separate Web-App verwendet wird. Ich hatte 0 Probleme beim "Andocken" der Web-App, aber der Service erweist sich als Albtraum. Es basiert auf JavaFX und es gibt eine Eigenschaft, die vom Benutzer in der Konfigurationsdatei festgelegt werden kann, sodass die App keine Fenster, Menüs, Container usw. initialisiert. Dieser "kopflose" Modus (nicht sicher, ob dies wirklich der Fall ist) kopflos ...) verwandelt die Service-App effektiv in einen Hintergrunddienst. Lassen Sie mich dies auch vorwegnehmen, indem Sie sagen, dass die App auf meinem Windows 10-Computer absolut einwandfrei funktioniert und dass ich sie ohne Probleme auf mehreren anderen Computern (alle nicht dockerisiert) bereitgestellt habe.

Hier ist die Docker-Datei, die ich mir ausgedacht habe:

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

Ich benutze dann diesen Befehl, um den Container zu erstellen:

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

Angenommen, VcXsrv wird auf meinem PC ausgeführt, wird die App korrekt gestartet, obwohl beim ersten Start folgende Warnungen ausgegeben werden:

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

Das Problem ist, dass es nur etwa 2 Minuten lang funktioniert. Schließlich kommt der Container mit diesem Fehler und stürzt ab:

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

Ich verstehe, dass die ersten Meldungen darauf zurückzuführen sind, dass der Container keinen NVidia-Treiber hat, aber der Fallback auf die Software-Pipeline scheint gut zu funktionieren. Ehrlich gesagt habe ich keine Ahnung, woran der schwerwiegende E / A-Fehler liegen könnte. Ich habe auf verschiedenen Hosts versucht, Docker auszuführen, und das gleiche Problem tritt auf.

Irgendeine Idee, wie man das behebt? Noch besser, eine Idee, wie man eine JavaFX-App WIRKLICH kopflos macht und nicht einmal die Initialisierung eines dieser Dinge erfordert? Wenn ich kopflos laufe, verwende ich Aufgaben und solche, die Teil von JavaFX sind, also kann ich sie nicht einfach nicht verwenden ...

Martin
quelle
Haben Sie versucht, den Host-Xserver in der Container-Laufzeit (dh -v /tmp/.X11-unix:/tmp/.X11-unix) zu binden ? Die App, die versucht, eine Verbindung zum Xserver herzustellen, schlägt vor, dass sie nicht "kopflos" ist und die Implementierung überprüfen muss.
Masseyb
Versuchen Sie, mit GPU-Unterstützung zu arbeiten. "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 dies gibt mir diesen Fehler: Fehlerantwort vom Dämon: konnte Gerätetreiber "" mit Funktionen nicht auswählen: [[gpu]]
Martin
@masseyb Ich verwende Docker auf einem Windows-Computer
Martin

Antworten:

2

Installieren Sie xvfb in Ihrem Container, um einen virtuellen Bildschirm zu erstellen. Zur Docker-Datei wechseln:

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 

Fügen Sie Ihrem Projektordner ein neues Bash-Skript hinzu und nennen Sie es "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

Vergessen Sie nicht, -e DISPLAY=192.168.1.71:0.0aus Ihrem Docker-Ausführungsbefehl zu entfernen

leachim742
quelle
Können Sie mir zeigen, wie Sie den Einstiegspunkt von einem Befehl java -jar in einen Befehl ändern, der sowohl die Anweisung java -jar als auch den Befehl xvfb enthält?
Martin
Ich habe die hier beschriebene Methode ausprobiert: success.docker.com/article/… . Dies gibt mir den folgenden Fehler: standard_init_linux.go: 211: exec Benutzerprozess verursacht "exec Formatfehler"
Martin
@ Martin Ich habe meine Antwort bearbeitet. Ich hoffe, es ist jetzt klar.
leachim742
Entschuldigung, ich bin noch nicht sehr gut mit Unix :( Ich erhalte diesen Fehler, wenn ich jetzt den Docker-Run-Befehl ausführe: / bin / sh: 1: /run.sh: nicht gefunden
Martin
Sie müssen die Datei 'run.sh' erstellen, in der Ihre anderen Dateien wie Ihre snapshot.jar
leachim742