首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么可以在Docker镜像中手动运行Java程序,而不能作为入口点

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

Stack Overflow用户
提问于 2018-08-13 03:03:00
回答 1查看 2.4K关注 0票数 4

我创建了一个openjdk-11高山docker镜像,并将我的jar复制到其中。我的Dockerfile是这样的:

代码语言:javascript
复制
FROM pwittchen/alpine-java11
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} /opt/app.jar
ENTRYPOINT ["java", "-jar", "/opt/app.jar"]

如果我运行:

代码语言:javascript
复制
docker run -it image

然后

代码语言:javascript
复制
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

但是如果:

代码语言:javascript
复制
docker run -it --entrypoint /bin/sh image

然后我可以直接在shell中执行:

代码语言:javascript
复制
$ java -jar /opt/app.jar

而且很管用。

为什么作为入口点运行会使libjli.so库处于阴影状态,并尝试重新定位JLI*

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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所需的库在哪里。文件内容如下所示:

代码语言:javascript
复制
/lib
/usr/lib
/usr/local/lib
/usr/local/share/jdk-11/lib/jli

在构建阶段将文件复制到docker映像。我的新Dockerfile看起来像这样:

代码语言:javascript
复制
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"]

终于成功了。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51811955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档