【问题标题】:Cannot run JavaFX app on docker for more than a few minutes无法在 docker 上运行 JavaFX 应用程序超过几分钟
【发布时间】:2020-03-23 09:13:12
【问题描述】:

我开发了一个应用程序,用作一个单独的网络应用程序的通信服务。我有 0 个问题“码头化”网络应用程序,但该服务被证明是一场噩梦。它基于 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 应用程序真正无头,甚至不需要初始化任何这些东西吗?无头运行时,我使用任务等,它们是 JavaFX 的一部分,所以我不能不使用它...

【问题讨论】:

  • 是否尝试在容器运行时绑定挂载主机 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

标签: spring-boot docker opengl javafx nvidia


【解决方案1】:

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

运行.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

【讨论】:

  • 您能告诉我如何将入口点从 java -jar 命令更改为同时包含 java -jar 语句和 xvfb 命令的命令吗?
  • 我尝试了这里描述的方法:success.docker.com/article/…。这给了我以下错误:standard_init_linux.go:211: exec 用户进程导致“exec 格式错误”
  • 对不起,我对 unix 还不是很好 :( 现在执行 docker run 命令时出现此错误:/bin/sh: 1: /run.sh: not found
  • 你需要创建文件'run.sh',你的其他文件就像你的snapshot.jar一样存储在其中
  • 我至少得到了那部分哈哈,我确实这样做了,docker build 命令确实看到它并将其添加到图像中
猜你喜欢
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
相关资源
最近更新 更多