我创建了一个openjdk-11高山docker镜像,并将我的jar复制到其中。我的Dockerfile是这样的:
FROM pwittchen/alpine-java11
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} /opt/app.jar
ENTRYPOINT ["java", "-jar", "/opt/app.jar"]
如果我运行:
docker run -it image
然后
Error loading shared library libjli.so: No such file or directory (needed by /usr/local/share/jdk-11/bin/java)
Error relocating /usr/local/share/jdk-11/bin/java: JLI_Launch: symbol not found
Error relocating /usr/local/share/jdk-11/bin/java: JLI_PreprocessArg: symbol not found
Error relocating /usr/local/share/jdk-11/bin/java: JLI_ReportMessage: symbol not found
Error relocating /usr/local/share/jdk-11/bin/java: JLI_StringDup: symbol not found
Error relocating /usr/local/share/jdk-11/bin/java: JLI_MemFree: symbol not found
Error relocating /usr/local/share/jdk-11/bin/java: JLI_InitArgProcessing: symbol not found
Error relocating /usr/local/share/jdk-11/bin/java: JLI_AddArgsFromEnvVar: symbol not found
Error relocating /usr/local/share/jdk-11/bin/java: JLI_List_add: symbol not found
Error relocating /usr/local/share/jdk-11/bin/java: JLI_List_new: symbol not found
但是如果:
docker run -it --entrypoint /bin/sh image
然后我可以直接在shell中执行:
$ java -jar /opt/app.jar
而且很管用。
为什么作为入口点运行会使libjli.so库处于阴影状态,并尝试重新定位JLI*
发布于 2018-08-13 05:16:02
问题出在musl中。当您直接从shell执行时,musl能够读取库路径,但当您使用CMD和/或入口点执行时,musl无法解析库路径。
我能够在阅读之后找到这个,并且旧的问题已经在openjdk8-阿尔卑斯山解决了。那么这就是一种回归。
https://github.com/docker-library/openjdk/issues/77
要解决这个问题,首先要创建一个ld-musl-x86_64.pat文件,指定musl所需的库在哪里。文件内容如下所示:
/lib
/usr/lib
/usr/local/lib
/usr/local/share/jdk-11/lib/jli
在构建阶段将文件复制到docker映像。我的新Dockerfile看起来像这样:
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"]
终于成功了。
https://stackoverflow.com/questions/51811955
复制相似问题