Запуск приложения Java Swing GUI в Docker

Я пытаюсь запустить пользовательский графический интерфейс Java Swing с помощью панели инструментов докера в Windows. Теперь я хочу поместить это приложение в контейнер, но получаю следующую ошибку:

Exception in thread "main" java.lang.UnsatisfiedLinkError: 
/opt/jdk1.8.0_202/jre
/lib/amd64/libawt_xawt.so: libXext.so.6: cannot open shared object file: 
No such file or directory

Я запускаю файл докеров. Настройка такова:

1) Установите Linux

2) Установите JDK

3) Скопируйте папку, содержащую JAR

4) запустите контейнер докеров, который вызовет графический интерфейс (не интерфейс Linux, предпочтительно не использовать vnc).

Я использую Xlaunch для терминала в Windows и могу запустить firefox в докере с его помощью.

Это первый файл докеров

FROM anapsix/alpine-java
COPY ./myJarFolder /home/myJarFolder
CMD ["java","-jar","/home/myJarFolder/myJarFile.jar"]

Это второй файл докеров

FROM alpine:3.2

MAINTAINER Anastas Dancha [...]

# Install cURL

RUN apk --no-cache add ca-certificates

# Java Version

ENV JAVA_VERSION_MAJOR 8

ENV JAVA_VERSION_MINOR 45

ENV JAVA_VERSION_BUILD 14

ENV JAVA_PACKAGE       jdk

# Download and unarchive Java

RUN mkdir /opt && / curl -jksSLH "Cookie: oraclelicense=accept-securebackup-cookie" && / http://download.oracle.com/otn-pub/java/jdk/${JAVA_VERSION_MAJOR}u${JAVA_VERSION_MINOR}-b${JAVA_VERSION_BUILD}/${JAVA_PACKAGE}-${JAVA_VERSION_MAJOR}u${JAVA_VERSION_MINOR}-linux-x64.tar.gz | tar -xzf - -C /opt && / ln -s /opt/jdk1.${JAVA_VERSION_MAJOR}.0_${JAVA_VERSION_MINOR} /opt/jdk && / rm -rf /opt/jdk/*src.zip && /opt/jdk/lib/missioncontrol && /opt/jdk/lib/visualvm && /opt/jdk/lib/*javafx* && /opt/jdk/jre/lib/plugin.jar && /opt/jdk/jre/lib/ext/jfxrt.jar && /opt/jdk/jre/bin/javaws && /opt/jdk/jre/lib/javaws.jar && /opt/jdk/jre/lib/desktop && /opt/jdk/jre/plugin && /opt/jdk/jre/lib/deploy* && /opt/jdk/jre/lib/*javafx* && /opt/jdk/jre/lib/*jfx* && /opt/jdk/jre/lib/amd64/libdecora_sse.so && /opt/jdk/jre/lib/amd64/libprism_*.so && /opt/jdk/jre/lib/amd64/libfxplugins.so && /opt/jdk/jre/lib/amd64/libglass.so && /opt/jdk/jre/lib/amd64/libgstreamer-lite.so && /opt/jdk/jre/lib/amd64/libjavafx*.so &&    /opt/jdk/jre/lib/amd64/libjfx*.so

# Set environment

ENV JAVA_HOME /opt/jdk

ENV PATH ${PATH}:${JAVA_HOME}/bin   

# COPY myJarFolder from local repository to the image

COPY ./myJarFolder /usr/local/myJarFolder 

# Start the image with the jar file as the entrypoint

ENTRYPOINT ["java", "-jar", "usr/local/myJarFolder/myJarFile.jar"]

# EOF

Я получаю эту ошибку с первым файлом докеров

$ docker run -ti --rm -e DISPLAY = 10.193.146.124: 0.0 myDocker: 1.0 Исключение в потоке "main" java.lang.UnsatisfiedLinkError: /opt/jdk1.8.0_202/jre /lib/amd64/libawt_xawt.so: libXext.so.6: невозможно открыть файл общих объектов: нет такого файла или каталога в java.lang.ClassLoader $ NativeLibrary.load (собственный метод) в java.lang.ClassLoader.loadLibrary0 (ClassLoader.java:1941) в java.lang .ClassLoader.loadLibrary (ClassLoader.java:1824) в java.lang.Runtime.load0 (Runtime.java:809) в java.lang.System.load (System.java:1086) в java.lang.ClassLoader $ NativeLibrary. load (собственный метод) в java.lang.ClassLoader.loadLibrary0 (ClassLoader.java:1941) в java.lang.ClassLoader.loadLibrary (ClassLoader.java:1845) в java.lang.Runtime.loadLibrary0 (Runtime.java:870) в java.lang.System.loadLibrary (System.java:1122) в java.awt.Toolkit $ 3.run (Toolkit.java:1636) в java.awt.Toolkit $ 3.run (Toolkit .java: 1634) в java.security.AccessController.doPrivileged (собственный метод) в java.awt.Toolkit.loadLibraries (Toolkit.java:1633) в java.awt.Toolkit. (Toolkit.java:1670) в java.awt .Component. (Component.java:593) в java.lang.Class.forName0 (собственный метод) в java.lang.Class.forName (Class.java:348) в org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader. main (JarRsrcLoa der.java:56)

Я получаю ошибку разрешения для второго файла докеров в строке mkdir / opt.

Может кто-нибудь, пожалуйста, дайте мне знать, как это сделать в Windows.


person Deep    schedule 16.04.2019    source источник
comment
Вам будет намного проще просто установить JVM на свой хост и запустить там jar-файл. Чтобы эта работа работала, вам также понадобится X-сервер в вашей хост-системе Windows и решение проблем перенаправления X и разрешений между виртуальной машиной Docker Toolbox, контейнером и хостом; и это после вы получите правильный стек библиотеки в вашем изображении. Судя по всему, что я видел, Docker - не лучший способ запускать интерактивные настольные приложения.   -  person David Maze    schedule 16.04.2019
comment
Еще пара комментариев: 1. Вы используете Alpine 3.2 - это древний вариант. 2. Что еще более важно, сообщение об ошибке предполагает, что Java не может загрузить собственную библиотеку - это может означать глубокую несовместимость с libc (Alpine основана на musl libc, а не на более распространенной glibc). Попробуйте использовать ubuntu:18.04.   -  person valiano    schedule 16.04.2019
comment
@valiano Пробовал с последним Alpine, все равно не повезло.   -  person Deep    schedule 17.04.2019
comment
@David Maze Пробовал с Ubuntu, но получил некоторую ошибку разрешения при использовании curl или mkdir   -  person Deep    schedule 17.04.2019


Ответы (1)


Провел еще несколько исследований, и, судя по всему, следующий код запускает графический интерфейс, после этого есть некоторые ошибки, но это должно быть связано с некоторыми другими проблемами в самом графическом интерфейсе:

FROM openjdk:8

# Set environment

ENV JAVA_HOME /opt/jdk

ENV PATH ${PATH}:${JAVA_HOME}/bin   

# COPY myJarFolder from local repository to the image

COPY ./myJarFolder /usr/local/myJarFolder

# Start the image with the jar file as the entrypoint

ENTRYPOINT ["java", "-jar", "/usr/local/myJarFolder/myJarFile.jar"]

# EOF
person Deep    schedule 17.04.2019
comment
Это не ответ. Пожалуйста, включите эту информацию в свой вопрос. - person emix; 17.04.2019
comment
@Deep Рад, что у тебя все получилось. openjdk:8 основан на Debian stretch - вероятно, он лучше подходит для этого варианта использования, чем Alpine, поскольку основан на glibc. - person valiano; 17.04.2019
comment
@emix: Думаю, что да, так как вопрос заключался в том, чтобы запустить кастомную банку с использованием dockerfile. Проблема, с которой я столкнулся, была связана с инструментом, который я использовал (здесь Alpine Linux), теперь я сменил инструмент (openJDK), но вопрос остался прежним, и таким образом он разрешился. Если вы все еще думаете иначе, дайте мне знать, и я с радостью включу это в вопрос. - person Deep; 17.04.2019