Я разработал приложение, используемое в качестве службы связи для отдельного веб-приложения. У меня было 0 проблем с «докеризацией» веб-приложения, но сервис оказался кошмаром. Он основан на JavaFX и есть свойство, которое может быть установлено пользователем в файле конфигурации, что делает его таким, чтобы приложение не инициализировало окна, меню, контейнеры и т. Д. Этот режим "без головы" (не уверен, что это действительно без головы ...) эффективно превращает сервисное приложение в фоновый сервис. Позвольте мне также предвосхитить это, сказав, что приложение работает абсолютно безупречно при запуске на моем компьютере с Windows 10 и что я развернул его на нескольких других машинах (все без док-станции) без проблем.
Вот докер-файл, который я придумал:
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 TRULY безголовым и даже не требовать инициализации какого-либо из этих компонентов? Когда я работаю без головы, я использую Задачи и тому подобное, которые являются частью JavaFX, поэтому я не могу просто не использовать их ...
-v /tmp/.X11-unix:/tmp/.X11-unix
)? Приложение, пытающееся подключиться к серверу Xserver, предполагает, что оно не является «безголовым», и нужно будет пересмотреть реализацию.