Nano Hash - криптовалюты, майнинг, программирование

java.awt.AWTError: невозможно подключиться к оконному серверу X11, используя «: 0» в качестве значения переменной DISPLAY

Я пытался запустить приложение на основе 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


Ответы:


1

Вы используете java:8 базовое изображение, которое, скорее всего, не обеспечивает графическую среду.

Вы можете использовать базовый образ ubuntu:18.04 с установленными вручную пакетами openjdk-11-jdk и xvfb. Команда xvfb-run позаботится о настройке виртуальная среда X-сервера:

xvfb-run устанавливает авторитетный файл X (или использует существующий, указанный пользователем), записывает в него файл cookie (см. xauth(1x)) и затем запускает X-сервер Xvfb в качестве фонового процесса. . Идентификатор процесса Xvfb сохраняется для последующего использования. Затем указанная команда запускается с использованием дисплея X, соответствующего только что запущенному серверу Xvfb, и созданному ранее файлу полномочий X.

Файл Docker

FROM ubuntu:18.04
RUN apt-get update -y && apt-get upgrade -y && apt-get install -y openjdk-11-jdk xvfb 
ADD JFrameDocker.java MANIFEST.mf ./
RUN javac JFrameDocker.java
RUN jar cfm JFrameDocker.jar MANIFEST.mf JFrameDocker.class 
RUN xvfb-run java -jar JFrameDocker.jar

JFrameDocker.java

import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class JFrameDocker {

    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.setSize(800, 600);
        frame.setVisible(true);
        System.out.println("Up and running");
    }

}

MANIFEST.mf

Manifest-Version: 1.0
Main-Class: JFrameDocker
18.03.2019
  • Я попробовал ваши предложения, но это привело к следующей ошибке докера: Ответ об ошибке от демона: сбой создания среды выполнения OCI: container_linux.go: 344: запуск процесса контейнера вызвал выполнение exec: \ java \: исполняемый файл не найден в $ PATH: неизвестно. 18.03.2019
  • @SoumyaranjanPani посмотрите пример Dockerfile 18.03.2019
  • Я пытался использовать Dockerfile выше, но на этом шаге он зависает на RUN xvfb-run java -jar JFrameDocker.jar. 19.03.2019
  • @SoumyaranjanPani, он не застрял, он запускает предоставленный вами пример JFrame. Нет AWTError или HeadlessException, поэтому X-сервер и java настроены правильно. 19.03.2019
  • Если он работает, то почему я не вижу окно JFrame, которое печатает Hello World! (Я поделился выходным изображением с вопросом) 19.03.2019
  • @SoumyaranjanPani, потому что он работает в контейнере, а не в хост-системе. Вам нужно будет настроить переадресацию X, чтобы увидеть экран контейнера. 19.03.2019
  • Хорошо. Я понимаю. Не могли бы вы рассказать мне, как настроить переадресацию X, чтобы я мог видеть вывод на экране контейнера. 19.03.2019
  • На самом деле я настроил пересылку X11 внутри файлов ssh_config и sshd_config, но все равно не смог увидеть результат, даже если он не печатает оператор System.out.println(Up и бег); 19.03.2019
  • Внутри ssh_config есть три параметра, касающиеся переадресации X11, и я установил значение, как показано ниже: ForwardAgent yes ForwardX11 yes ForwardX11Trusted yes и в sshd_config X11Forwarding yes X11UseForwarding yes X11DisplayOffset 10 X11UseLocalhost yes 19.03.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..