java - Docker 中的 Java GUI Maven 项目出现 X11 错误
问题描述
我有一个 JavaFX Maven 项目。运行 我运行 Jar 文件,会弹出一个 GUI 为用户打开。我正在尝试从 Docker 容器中运行它。我正在使用 Ubuntu 16.04。
我不断收到此错误:
线程“AWT-EventQueue-0”java.awt.HeadlessException 中的异常:未设置 X11 DISPLAY 变量,但该程序执行了需要它的操作。
这是我的 Docker 文件(使用此处的解决方案)。
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"]
我已经查看了这个问题的许多其他答案,这是我尝试过的其他方法:
Run CMD with -Djava.awt.headless=true
. 在此处
尝试 SO 解决方案,您可以在容器中运行“xauth add”。但是 xauth “找不到”。所以我尝试添加到 Dockerfile。当我尝试构建时,我收到一条错误消息,提示找不到 xauth。我对.RUN sudo apt-get install xauth
x11-apps
我想也许它不会安装,因为在我的主机上找不到它(只是随机猜测),但我可以在我的主机上运行 xauth。
我见过的唯一其他解决方案涉及 Putty 和 ssh。我只想在我的计算机上运行 Docker 容器,而不是通过 ssh 进入另一个容器。我还看到了一些关于虚拟化的答案。我必须创建一个完整的虚拟机来运行一个程序吗?还是我错过了什么?
有人有什么建议吗?
解决方案
这绝对是可能的。给定的错误消息实际上非常好。 您需要设置 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。
推荐阅读
- amazon-web-services - Redshift 命令 - 复制添加带有随机数的列
- postgresql - 如何在 PostgreSQL 中替换表列值中的特定字符串
- excel - 如果范围包含某些值,则隐藏特定行
- ios - 缩放 UIPageControl 的当前点并使其居中
- javascript - componentDidMount() 中的高度值错误
- c++ - 这段代码有什么问题?它在第二个 cin 可以执行之前终止
- ssas - 创建计算度量以显示上个月的值
- c - C 文件保存和恢复输入信息
- ios - 如何在 iOS 中保存步进器的状态?
- mysql - SQL 参照完整性触发器