Не можна запускати додаток JavaFX на докер більше декількох хвилин


9

Я розробив додаток, що використовується як послуга зв'язку для окремого веб-додатку. У мене було 0 питань "докерізувати" веб-додаток, але ця послуга виявляється кошмаром. Він заснований на JavaFX і є властивість, яку користувач може встановити у конфігураційному файлі, завдяки чому додаток не ініціалізує жодних вікон, меню, контейнерів тощо. Цей "безголовий" режим (не впевнений, що це справді безголовий ...) ефективно перетворює додаток служби у фоновий сервіс. Дозвольте також передмовити це, сказавши, що додаток працює абсолютно бездоганно, коли запускається на моїй машині Windows 10, і що я розгорнув його на декількох інших машинах (усі без докерів) без проблем.

Ось dockerfile, який я придумав:

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

Потім я використовую цю команду для створення контейнера:

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

Якщо припустимо, що VcXsrv працює на моєму ПК, програма запускається правильно, хоча при першому запуску вона дає такі попередження:

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

Проблема полягає в тому, що він працює лише 2 хвилини. Врешті-решт контейнер виходить із цією помилкою та виходить з ладу:

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

Я розумію, що початкові повідомлення пояснюються тим, що контейнер не має драйвера NVidia, але, здається, резервна робота програмного конвеєра працює нормально. Чесно кажучи, я не маю поняття, до чого може бути спричинена фатальна помилка вводу-виводу. Я пробував на різних хостах, які працюють докер, і таке ж питання трапляється.

Будь-яка ідея, як це виправити? Ще краще, будь-яка ідея, як зробити програму JavaFX ПРАВИЛЬНО безголовою і навіть не вимагати ініціалізації будь-якого з цих матеріалів? Під час роботи без голови я використовую Завдання та такі, які входять до JavaFX, тому я не можу просто не використовувати його ...


Спробували встановити прив'язку хостів Xserver в час виконання контейнерів (тобто -v /tmp/.X11-unix:/tmp/.X11-unix)? Додаток, який намагається приєднатися до Xserver, говорить про те, що це не "без голови", потрібно буде переглянути реалізацію.
masseyb

спробуйте запуститись із підтримкою GPU. "docker run -t --name Some_Service --gpus all -e DISPLAY = 192.168.1.71: 0.0 -e SERVICE_HOME = - посилання mySQLMD: mysql some_service"
arshpreet

@arshpreet це дає мені цю помилку: Відповідь на помилку від демона: не вдалося вибрати драйвер пристрою "" з можливостями: [[gpu]]
Мартін

@masseyb Я запускаю докер на машині Windows
Мартін

Відповіді:


2

Встановіть xvfb у свій контейнер, щоб створити віртуальний екран. змінити файл 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 

Додати новий скрипт bash у свою папку проекту та назвати його "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

Не забудьте видалити -e DISPLAY=192.168.1.71:0.0з команди запуску докер


Чи можете ви показати мені, як змінити вхідну точку з команди java -jar на команду, що містить і java -jar, і команду xvfb?
Мартін

Я спробував описаний тут метод: success.docker.com/article/… . Це дає мені таку помилку: standard_init_linux.go: 211: exec користувацький процес викликав "помилку формату exec"
Мартін

@Martin я відредагував свою відповідь, сподіваюся, її зрозуміла зараз.
leachim742

Вибачте, я ще не дуже добре з Unix :( Я отримую цю помилку під час виконання команди docker run: / bin / sh: 1: /run.sh: не знайдено
Мартін

вам потрібно створити файл 'run.sh', де зберігаються ваші інші файли, як ваш snapshot.jar
leachim742
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.