Docker 中的 Java GUI Maven 项目出现 X11 错误

Posted

技术标签:

【中文标题】Docker 中的 Java GUI Maven 项目出现 X11 错误【英文标题】:Java GUI Maven Project in Docker with X11 Error 【发布时间】:2019-02-07 13:23:37 【问题描述】:

我有一个 JavaFX Maven 项目。运行 我运行 Jar 文件,会弹出一个 GUI 为用户打开。我正在尝试从 Docker 容器中运行它。我使用的是 Ubuntu 16.04。

我不断收到此错误:

线程“AWT-EventQueue-0”java.awt.HeadlessException 中的异常:否 X11 DISPLAY 变量被设置,但是这个程序执行了一个操作 这需要它。

这是我的 Docker 文件(使用来自 here 的解决方案)。

FROM docker.io/java as firstStage
WORKDIR /workdir/
RUN /usr/sbin/useradd --comment Developer \
                  --home-dir /home/developer \
                  --non-unique --uid 1000 --user-group --system \
                  --shell /bin/bash developer && mkdir -p /home/developer

RUN chown -R developer:developer /home/developer && mkdir -p /opt/app && chown -R developer:developer /opt/app

RUN echo 'developer ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
USER developer
ENV HOME /home/developer
VOLUME /opt/app

FROM maven:3.5.0-jdk-8
COPY --from=firstStage /workdir/ .
COPY . /
RUN apt-get update && apt-get install -y --no-install-recommends openjfx && rm -rf /var/lib/apt/lists/* && mvn clean install && DISPLAY=localhost:0.0

CMD ["java","-jar","/target/CodeDemo-1.0-SNAPSHOT.jar"]

我已经查看了这个问题的许多其他答案,以下是我尝试过的其他方法: 使用 -Djava.awt.headless=true 运行 CMD。 尝试 SO 解决方案 here 在容器中运行“xauth add”。但是 xauth “找不到”。所以我尝试将RUN sudo apt-get install xauth 添加到Dockerfile。当我尝试构建时,我收到一条错误消息,提示找不到 xauth。我对x11-apps 做了同样的事情。

我认为它可能无法安装,因为在我的主机上找不到它(只是随机猜测),但我可以在我的主机上运行 xauth。

我见过的唯一其他解决方案涉及 Putty 和 ssh。我只想在我的计算机上运行 Docker 容器,而不是通过 ssh 进入另一个容器。我还看到了一些关于虚拟化的答案。我必须创建一个完整的虚拟机来运行一个程序吗?还是我错过了什么?

大家有什么建议吗?

【问题讨论】:

一些灵感可能:阅读this 这似乎是一个巨大的挑战,不确定您是否可以在不虚拟化整个目标操作系统的情况下运行桌面 GUI 应用程序。祝你好运,让我们知道。 谢谢你们。我在想这可能不像我想的那么简单,但我刚开始使用 Docker,并认为我错过了一些简单的东西。 @FedericoklezCulloca 感谢这篇文章。 【参考方案1】:

这绝对是可能的。给定的错误消息实际上非常好。 您需要设置 X11 DISPLAY 变量。

您的问题的解决方案可能就像添加一样简单

-e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix

到您的docker run 命令。您可能需要运行

sudo xhost +

在此之前,为了允许连接到您的主机 XServer。

您还可以查看以下博客文章,他们对此进行了更详细的解释:

https://medium.com/@SaravSun/running-gui-applications-inside-docker-containers-83d65c0db110 https://medium.com/dot-debug/running-chrome-in-a-docker-container-a55e7f4da4a8

如果您还需要实际的图形支持,例如OpenGL,看看https://github.com/NVIDIA/nvidia-docker。

【讨论】:

以上是关于Docker 中的 Java GUI Maven 项目出现 X11 错误的主要内容,如果未能解决你的问题,请参考以下文章

Java Maven 项目中的 Docker 指令跳过测试

java开发GUI程序,用maven搭建环境

将maven项目打包在docker容器中的运行过程

如何在OSX上的docker-machine中的docker容器中显示gui视图?

如何配置 maven 以生成更详细的 Jmeter 结果,类似于 Jmeter GUI 中的视图结果树?

svn+jenkins+docker 发布 java 项目(maven)