Nie można uruchomić aplikacji JavaFX w oknie dokowanym przez więcej niż kilka minut

9

Opracowałem aplikację służącą jako usługa komunikacyjna dla osobnej aplikacji internetowej. Miałem 0 problemów z „dokowaniem” aplikacji internetowej, ale usługa okazała się koszmarem. Opiera się na JavaFX i użytkownik może ustawić w pliku konfiguracyjnym właściwość, która sprawia, że ​​aplikacja nie inicjuje żadnych okien, menu, kontenerów itp. Ten tryb „bezgłowy” (nie jestem pewien, czy to naprawdę bezgłowy ...) skutecznie zmienia aplikację serwisową w usługę działającą w tle. Pozwolę sobie również powiedzieć, że aplikacja działa absolutnie bezbłędnie po uruchomieniu na moim komputerze z systemem Windows 10 i że wdrożyłem ją na kilku innych komputerach (wszystkie bez dokowania) bez żadnych problemów.

Oto plik docker, który wymyśliłem:

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

Następnie używam tego polecenia do zbudowania kontenera:

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

Zakładając, że VcXsrv działa na moim komputerze, aplikacja uruchamia się poprawnie, chociaż daje te ostrzeżenia przy pierwszym uruchomieniu:

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

Problem polega na tym, że działa tylko przez około 2 minuty. W końcu kontener pojawia się z tym błędem i ulega awarii:

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

Rozumiem, że początkowe komunikaty są spowodowane tym, że kontener nie ma sterownika NVidia, ale powrót do potoku oprogramowania wydaje się działać dobrze. Szczerze mówiąc, nie mam pojęcia, co może być przyczyną fatalnego błędu we / wy. Próbowałem na różnych hostach z uruchomionym dokerem i zdarza się ten sam problem.

Jakiś pomysł jak to naprawić? Co więcej, masz pomysł, jak sprawić, by aplikacja JavaFX była PRAWDZIWĄ bezgłowa i nawet nie wymagała inicjalizacji żadnego z tych elementów? Kiedy pracuję bez głowy, korzystam z zadań i takich, które są częścią JavaFX, więc nie mogę po prostu tego nie używać ...

Jaskółka oknówka
źródło
Czy próbowałeś zamontować bind Xserver w środowisku wykonawczym kontenerów (tj. -v /tmp/.X11-unix:/tmp/.X11-unix)? Aplikacja próbująca dołączyć do Xservera sugeruje, że nie jest to „bezgłowy”, musiałaby sprawdzić implementację.
masseyb
spróbuj uruchomić z obsługą 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 daje mi ten błąd: Odpowiedź błędu od demona: nie można wybrać sterownika urządzenia „” z możliwościami: [[gpu]]
Martin
@masseyb Korzystam z dokera na komputerze z systemem Windows
Martin

Odpowiedzi:

2

Zainstaluj xvfb w swoim kontenerze, aby utworzyć wirtualny ekran. zmień na plik 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 

Dodaj nowy skrypt bash do folderu projektu i nadaj mu nazwę „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

Nie zapomnij usunąć -e DISPLAY=192.168.1.71:0.0z polecenia uruchamiania dokera

leachim742
źródło
Czy możesz mi pokazać, jak zmienić punkt wejścia z polecenia java -jar na polecenie zawierające zarówno instrukcję java -jar, jak i polecenie xvfb?
Martin
Wypróbowałem metodę opisaną tutaj: success.docker.com/article/… . Daje mi to następujący błąd: standard_init_linux.go: 211: proces użytkownika exec spowodował „błąd formatu exec”
Martin
@Martin zredagowałem moją odpowiedź, mam nadzieję, że jest teraz jasna.
leachim742,
przepraszam, nie jestem jeszcze zbyt dobry w unixie :( Otrzymuję ten błąd podczas wykonywania polecenia uruchamiania dokera teraz: / bin / sh: 1: /run.sh: nie znaleziono
Martin
musisz utworzyć plik „run.sh”, w którym przechowywane są inne pliki, takie jak plik snapshot.jar
leachim742,