为什么可以在Docker映像中手动运行Java程序,而不能作为入口点

为什么可以在Docker映像中手动运行Java程序,而不能作为入口点,docker,alpine,java-11,Docker,Alpine,Java 11,我创建了一个openjdk-11 alpine docker映像,并将我的jar复制到其中。我的Dockerfile如下所示: FROM pwittchen/alpine-java11 VOLUME /tmp ARG JAR_FILE COPY ${JAR_FILE} /opt/app.jar ENTRYPOINT ["java", "-jar", "/opt/app.jar"] /lib /usr/lib /usr/local/lib /usr/local/share/jdk-11/lib/

我创建了一个openjdk-11 alpine docker映像,并将我的jar复制到其中。我的Dockerfile如下所示:

FROM pwittchen/alpine-java11
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} /opt/app.jar
ENTRYPOINT ["java", "-jar", "/opt/app.jar"]
/lib
/usr/lib
/usr/local/lib
/usr/local/share/jdk-11/lib/jli
FROM pwittchen/alpine-java11
VOLUME /tmp
ARG JAR_FILE
#Copy the configuration file with the Library path!
COPY ld-musl-x86_64.path /etc/ld-musl-x86_64.pat
COPY ${JAR_FILE} /opt/app.jar
ENTRYPOINT ["java", "-jar", "/opt/app.jar"]
如果我跑步:

docker run -it image
然后

但如果:

docker run -it --entrypoint /bin/sh image
然后我可以直接在shell中执行:

$ java -jar /opt/app.jar
而且有效


为什么作为入口点运行会使libjli.so库变暗,并尝试重新定位JLI*?问题出在musl中。直接从shell执行时,musl能够读取库路径,但使用CMD和/或ENTRYPOINT执行时,musl无法解析库路径

我在阅读后发现了这个问题,这个老问题已经在openjdk8中解决了。那么这是一个回归

要解决此问题,请首先创建一个文件ld-musl-x86_64.pat,指定musl所需的库的位置。文件内容如下所示:

FROM pwittchen/alpine-java11
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} /opt/app.jar
ENTRYPOINT ["java", "-jar", "/opt/app.jar"]
/lib
/usr/lib
/usr/local/lib
/usr/local/share/jdk-11/lib/jli
FROM pwittchen/alpine-java11
VOLUME /tmp
ARG JAR_FILE
#Copy the configuration file with the Library path!
COPY ld-musl-x86_64.path /etc/ld-musl-x86_64.pat
COPY ${JAR_FILE} /opt/app.jar
ENTRYPOINT ["java", "-jar", "/opt/app.jar"]
在构建阶段,将文件复制到docker映像。我的新Dockerfile如下所示:

FROM pwittchen/alpine-java11
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} /opt/app.jar
ENTRYPOINT ["java", "-jar", "/opt/app.jar"]
/lib
/usr/lib
/usr/local/lib
/usr/local/share/jdk-11/lib/jli
FROM pwittchen/alpine-java11
VOLUME /tmp
ARG JAR_FILE
#Copy the configuration file with the Library path!
COPY ld-musl-x86_64.path /etc/ld-musl-x86_64.pat
COPY ${JAR_FILE} /opt/app.jar
ENTRYPOINT ["java", "-jar", "/opt/app.jar"]

终于开始工作了。

因为我无法发表评论。。。musl和jdk存在问题,您可以注意到Alpine已从openjdk docker映像的标记中删除。您可以使用libcIs尝试其他发行版。这真的是libc的问题吗?因为我使用的是openjdk而不是oracle jdk,并且能够从shell手动运行程序,这让我觉得这不是库的问题,而是权限或环境变量的问题。没有想法?除了前面的评论之外,我还使用了相同的结果进行了测试,是什么让我认为这不是一个与缺少libc相关的问题。在某些情况下,3d party glibc不是一个解决方案。。试试ubuntu/debian,或centos/rhel image,例如,这不是真正的和可选的,所有这些使我的应用程序在Java 11上工作的练习都是使用jlink将docker映像大小减少到50MB,如果我使用sid或slim映像,我将以超过100MB结束。然后,最好还是使用老朋友openjdk8的alpine图像。