不能在Docker上运行JavaFX应用超过几分钟


9

我开发了一个用作单独Web应用程序的通信服务的应用程序。我有0个问题“正在使Web应用程序码头化”,但事实证明该服务是一场噩梦。它基于JavaFX,并且可以由用户在配置文件中设置一个属性,该属性使该属性不会使应用程序初始化任何窗口,菜单,容器等。这种“无头”模式(不确定是否真正无头...)有效地将服务应用程序变为后台服务。让我也以此开头作为开头,说该应用程序在Windows 10机器上运行时绝对可以完美运行,并且我已经将其部署在其他几台机器(所有未经过dockerized)上,没有任何问题。

这是我想出的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在我的PC上运行,则该应用程序可以正确启动,尽管在首次启动时确实会给出以下警告:

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驱动程序,但是回退到软件管道似乎可以正常工作。老实说,我不知道致命的IO错误可能是由什么引起的。我已经在运行docker的不同主机上尝试过,并且发生了相同的问题。

任何想法如何解决这个问题?更好的是,您有什么主意如何使JavaFX应用程序真正变得无头,甚至不需要初始化任何东西?无头运行时,我使用Tasks等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 = --link mySQLMD:mysql some_service”
arshpreet

@arshpreet,这给了我这个错误:来自守护程序的错误响应:无法选择具有以下功能的设备驱动程序“”:[[gpu]]
Martin

@masseyb我正在Windows机器上运行docker
Martin

Answers:


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从docker run命令中删除


您能告诉我如何将入口点从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:找不到
Martin

您需要创建文件“ run.sh”,其他文件也将像snapshot.jar一样存储在该文件中
leachim742
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.