【发布时间】:2019-08-08 19:03:23
【问题描述】:
我一直在尝试在 Docker 内的 Ubuntu VM 上运行 基于 Java AWT 的应用程序。该应用程序是一个非常简单的应用程序,它通过 Eclipse 在 Windows 上完美运行。它只是打开一个窗口并打印 hello world!。事实上,当我将 jar 文件导出到运行在我的 Windows 主机上的 Ubuntu VM 时,当我通过 “java -jar JFrameDocker.jar” 运行 jar 文件时,我也会得到与 Windows 相同的输出.
但是,当我尝试在 docker 中运行它时,情况就不一样了。我在 Dockerfile 中指定的指令执行时没有任何错误,但是当我运行应用程序时它会抛出 “java.awt.AWTError: Can't connect to X11 window server using ':0' as the value of DISPLAY variable” .相信我,伙计们,我已经尝试了很多次来解决它,但直到现在都没有运气。 就像多次设置 DISPLAY 变量值,使用 xterm 和 xeyes 启动 X 服务器,浏览我在网上找到的所有可能的文章。但这里似乎没有任何效果。我在这里提供了我的所有文件,可以让您更好地了解我的问题。 顺便说一句,this 没有回答我的问题,因为即使在进行更改之后也会引发同样的错误。
这是我的 java 文件。
package com.etp;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class JFrameDockerTest {
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JLabel lable = new JLabel("Hello World");
panel.setLayout( new FlowLayout() );
frame.add(panel);
panel.add(lable);
frame.setVisible(true);
frame.setSize(800, 600);
}
}
这是我的 Dockerfile:
FROM java:8
ENV DISPLAY :0
ADD JFrameDocker.jar JFrameDocker.jar
CMD ["java","-jar", "JFrameDocker.jar"]
我使用下面的 docker 命令来构建镜像并运行它。
Docker 构建:sudo docker build -t jframedocker .
Docker 运行:sudo docker run jframedocker
Output Without Error Screenshot: (Without Docker)
使用 Docker 输出:
etp@etp-VirtualBox:~/Downloads/JFrameDocker$ sudo docker run jframedocker
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.awt.AWTError: Can't connect to X11 window server using ':0' as the value of the DISPLAY variable.
at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
at sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:65)
at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:115)
at java.security.AccessController.doPrivileged(Native Method)
at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:74)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at java.awt.GraphicsEnvironment.createGE(GraphicsEnvironment.java:103)
at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:82)
at java.awt.Window.initGC(Window.java:475)
at java.awt.Window.init(Window.java:495)
at java.awt.Window.<init>(Window.java:537)
at java.awt.Frame.<init>(Frame.java:420)
at java.awt.Frame.<init>(Frame.java:385)
at javax.swing.JFrame.<init>(JFrame.java:189)
at com.etp.JFrameDockerTest.main(JFrameDockerTest.java:12)
... 5 more
【问题讨论】:
-
类似的事情在上面的网址中讨论过。
-
我试过那个,但无法解决。这导致我用简单的例子发布问题
标签: java docker dockerfile x11-forwarding