Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 无法在docker上运行JavaFX应用程序超过几分钟_Spring Boot_Docker_Opengl_Javafx_Nvidia - Fatal编程技术网

Spring boot 无法在docker上运行JavaFX应用程序超过几分钟

Spring boot 无法在docker上运行JavaFX应用程序超过几分钟,spring-boot,docker,opengl,javafx,nvidia,Spring Boot,Docker,Opengl,Javafx,Nvidia,我开发了一个应用程序,作为一个单独的web应用程序的通信服务。我有0个问题“docking”的网络应用程序,但该服务被证明是一个噩梦。它基于JavaFX,用户可以在配置文件中设置一个属性,使应用程序不会初始化任何窗口、菜单、容器等。这种“无头”模式(不确定是否真正无头…)有效地将服务应用程序转换为后台服务。让我先说一句,这个应用程序在我的Windows10机器上运行时绝对完美无瑕,我已经在其他几台机器上部署了它(都是非停靠的),没有任何问题 这是我提出的dockerfile: FROM open

我开发了一个应用程序,作为一个单独的web应用程序的通信服务。我有0个问题“docking”的网络应用程序,但该服务被证明是一个噩梦。它基于JavaFX,用户可以在配置文件中设置一个属性,使应用程序不会初始化任何窗口、菜单、容器等。这种“无头”模式(不确定是否真正无头…)有效地将服务应用程序转换为后台服务。让我先说一句,这个应用程序在我的Windows10机器上运行时绝对完美无瑕,我已经在其他几台机器上部署了它(都是非停靠的),没有任何问题

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


你知道怎么解决这个问题吗?更好的是,你知道如何让JavaFX应用程序真正无头,甚至不需要初始化这些东西吗?在运行headless时,我使用任务等JavaFX的一部分,所以我不能不使用它…

在容器中安装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

别忘了从docker run命令中删除
-e DISPLAY=192.168.1.71:0.0

是否已尝试在容器运行时绑定挂载主机Xserver(即
-v/tmp/.X11 unix:/tmp/.X11 unix
)?尝试连接到Xserver的应用程序表明它不是“无头的”,需要检查实现。请尝试在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这给了我这个错误:来自守护程序的错误响应:无法选择设备驱动程序“”,功能:[[gpu]]@masseyb我正在Windows机器上运行docker您能告诉我如何将入口点从java-jar命令更改为同时包含java-jar语句和xvfb命令的命令吗?我尝试了下面描述的方法:。这给了我以下错误:standard_init_linux.go:211:exec用户进程导致“exec格式错误”抱歉,我还不太擅长unix:(我现在在执行docker run命令时遇到此错误:/bin/sh:1:/run.sh:not found您需要创建文件“run.sh”,其中存储其他文件,如快照。jari至少得到了这一部分哈哈,我做到了,docker build命令确实看到了它并将其添加到图像中