Я розробив додаток, що використовується як послуга зв'язку для окремого веб-додатку. У мене було 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, тому я не можу просто не використовувати його ...
-v /tmp/.X11-unix:/tmp/.X11-unix
)? Додаток, який намагається приєднатися до Xserver, говорить про те, що це не "без голови", потрібно буде переглянути реалізацію.