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ć ...
-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ę.Odpowiedzi:
Zainstaluj xvfb w swoim kontenerze, aby utworzyć wirtualny ekran. zmień na plik Docker:
Dodaj nowy skrypt bash do folderu projektu i nadaj mu nazwę „run.sh”
run.sh:
Nie zapomnij usunąć
-e DISPLAY=192.168.1.71:0.0
z polecenia uruchamiania dokeraźródło