当前位置: 首页 > 知识库问答 >
问题:

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

琴琪
2023-03-14

我创建了一个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

而且有效。

为什么作为ENTRYPOINT运行会使libjli.so库阴影并尝试重新定位JLI*?

共有1个答案

邵畅
2023-03-14

问题出在musl中。当您直接从shell执行时,musl能够读取库路径,但当您使用CMD和/或ENTRYPOINT执行时,musl无法解析库路径。

我在阅读后找到了这个,旧问题已经在openjdk8-alpine中解决了。那么这是一个回归。

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"]

终于开始工作了。

 类似资料:
  • 我正在尝试将我的程序导出为一个可运行的JAR。该程序在eclipse中工作得非常好,但它不能作为一个可运行的JAR运行。我正在使用另外3个jar文件作为引用jar,这样我就可以使用音频,我认为这可能是问题所在。可运行的jar启动,但它只是一个全白的窗口,程序没有启动。 我点击我的项目,然后右键点击并选择“导出”,然后我选择“可运行的JAR”选项。我尝试使用所有三个处理引用库的选项来创建jar。 将

  • 问题内容: 在Chrome浏览器中,它会像应有的那样执行HTTP PUT,但在FireFox 21中却没有。在javascript控制台或后端中没有错误。 这是HTML: 这是jQuery: 我在Fiddler中观察到了它们,并且正常工作(Chrome)和无效工作(Firefox)之间的区别是HTTP PUT在Chrome中启动,而在Firefox中不启动。 现在,我知道并不是所有浏览器都可以保证

  • 我的应用程序在emulator上运行得很好,但当我导出后在我的智能手机(galaxy s3)上运行它时,它会在这个活动中崩溃,因为有HTTP连接!问题出在哪里?代码还是导出?当我点击连接按钮时,它崩溃了。

  • 我的手机已打开并处于调试模式,我已经使用确认了这一点。当我运行ionic run android时,我得到的输出如下,Ionic声称应用程序已启动,但手机上什么也没发生。我使用的是带有android 4.4.4的Nexus 5。 index.html在android应用程序:

  • 我有一个简单的代码 我觉得我身边少了点什么。 谢谢你的帮助。

  • 我用ReactJS制作了一个网络应用程序。它在本地主机上运行良好。然而,当我部署到Azure时,每次导航到新页面或重新加载页面时,我都会收到404个错误。 我正在使用Browser路由器,我从网上查看中了解到这有时会导致问题,但我还没有找到解决它的方法。 我在 GitHub 中有该应用程序,因此在 Azure 中我链接到存储库。除了由create-react-app生成的代码外,我还有一个web.