在Docker上运行Java Swing GUI应用程序

5

我正在尝试在 Windows 上使用 Docker 工具箱运行自定义 Java Swing GUI。现在,我想将此应用程序容器化,但是遇到以下错误:

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

我正在运行一个dockerfile。 设置步骤如下:

1)安装Linux

2)安装JDK

3)复制包含JAR的文件夹

4)运行docker容器,这将启动GUI(不是Linux前端,不使用vnc更好)。

我在Windows上使用Xlaunch终端,并能够使用它启动docker上的Firefox。

这是第一个docker文件

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

这是第二个 Docker 文件

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

我在第一个Dockerfile中遇到了这个错误

$ docker run -ti --rm -e DISPLAY=10.193.146.124:0.0 myDocker:1.0 Exception in thread "main" java.lang.UnsatisfiedLinkError: /opt/jdk1.8.0_202/jre /lib/amd64/libawt_xawt.so: libXext.so.6: 没有那个文件或目录 at java.lang.ClassLoader$NativeLibrary.load(Native Method) at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941) at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824) at java.lang.Runtime.load0(Runtime.java:809) at java.lang.System.load(System.java:1086) at java.lang.ClassLoader$NativeLibrary.load(Native Method) at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941) at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1845) at java.lang.Runtime.loadLibrary0(Runtime.java:870) at java.lang.System.loadLibrary(System.java:1122) at java.awt.Toolkit$3.run(Toolkit.java:1636) at java.awt.Toolkit$3.run(Toolkit.java:1634) at java.security.AccessController.doPrivileged(Native Method) at java.awt.Toolkit.loadLibraries(Toolkit.java:1633) at java.awt.Toolkit.(Toolkit.java:1670) at java.awt.Component.(Component.java:593) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoa der.java:56)

我在第二个Dockerfile中的mkdir /opt行遇到了权限错误

有人能告诉我在windows上正确的做法吗?


你会发现在主机上安装JVM并在那里运行jar文件要容易得多。为了使其工作,您还需要在Windows主机系统上安装X服务器,并处理Docker Toolbox VM、容器和主机之间的X转发和权限问题;而这是在您获取正确的库堆栈图像之后。从我所看到的一切来看,Docker只是运行交互式桌面应用程序的不好方法。 - David Maze
1
另外还有几点需要注意:1. 您正在使用 Alpine 3.2 - 这是非常古老的版本。2. 更重要的是,错误信息表明 Java 无法加载本地库 - 这可能意味着深层次的 libc 不兼容性(Alpine 基于 musl libc,而不是更常见的 glibc)。建议尝试使用 ubuntu:18.04 - valiano
@valiano 尝试使用最新的Alpine,但仍然没有成功。 - Deep
@David Maze 尝试使用Ubuntu,但在使用curl或mkdir时遇到了一些权限错误。 - Deep
Alpine 3.17.0也存在同样的问题。 - dmatej
1个回答

2

我进行了更多的研究,通过尝试以下代码似乎可以启动GUI,但之后会出现一些错误,但这可能是GUI本身的其他问题导致的:

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

这不是一个答案。请将这些信息包含在您的问题中。 - Mike Doe
1
@Deep,很高兴你解决了问题。openjdk:8基于Debian stretch - 对于这种用例来说,这可能比Alpine更合适,因为它是基于glibc的。 - valiano
1
@emix:我认为是这样的,因为问题是要使用dockerfile运行自定义jar文件。我遇到的问题是由于我使用的工具(这里是Alpine Linux),现在我已经更换了工具(openJDK),但问题仍然存在,并且通过这样做得到了解决。如果您仍然持有不同意见,请告诉我,我很乐意将其包含在问题中。 - Deep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接