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 ...
-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.Antworten:
Installieren Sie xvfb in Ihrem Container, um einen virtuellen Bildschirm zu erstellen. Zur Docker-Datei wechseln:
Fügen Sie Ihrem Projektordner ein neues Bash-Skript hinzu und nennen Sie es "run.sh".
run.sh:
Vergessen Sie nicht,
-e DISPLAY=192.168.1.71:0.0
aus Ihrem Docker-Ausführungsbefehl zu entfernenquelle