Я пытался запустить приложение на основе Java AWT на виртуальной машине Ubuntu внутри Docker. Приложение очень простое и безупречно работает в Windows через Eclipse. Он просто открывает окно и печатает hello world!. На самом деле, когда я экспортирую файл jar на виртуальную машину Ubuntu, работающую на моем хосте Windows, я получаю тот же результат, что и Windows, когда я запускаю файл jar через "java -jar JFrameDocker.jar". .
Однако история не такая, когда я пытаюсь запустить ее внутри докера. Инструкции, которые я указал в Dockerfile, выполняются без ошибок, но когда я запускаю приложение, оно выдает «java.awt.AWTError: не удается подключиться к оконному серверу X11, используя «: 0» в качестве значения DISPLAY. переменная” . Поверьте мне, ребята, я много раз пытался решить эту проблему, но пока безуспешно. Например, установка значения переменной DISPLAY несколько раз, запуск X-сервера с использованием xterm и xeyes, просмотр всех возможных статей, которые я нашел в Интернете. Но, похоже, здесь ничего не работает. Я предоставляю здесь все свои файлы, которые помогут вам лучше понять мою проблему. Кстати это не отвечает на мой вопрос, так как такая же ошибка возникает даже после внесения изменений.
Это мой файл 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"]
Я использовал приведенные ниже команды докера для создания образа и его запуска.
Сборка докера: sudo docker build -t jframedocker .
Запуск докера: sudo docker run jframedocker
Снимок вывода без ошибок: (без 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
Dockerfile
18.03.2019JFrame
. НетAWTError
илиHeadlessException
, поэтому X-сервер и java настроены правильно. 19.03.2019