我正在构建一个Java应用程序,我将在docker容器中托管。此应用程序的一部分是使用此库:
https://github.com/wooio/htmltopdf-java
它需要一个URL并将其转换为PDF文档。但是,当通过docker运行.jar
文件时,我得到的错误是它缺少本机依赖项:
java.lang.UnsatisfiedLinkError: Unable to load library '/tmp/io.woo.htmltopdf/wkhtmltox/0.12.5/libwkhtmltox.so': Native library (tmp/io.woo.htmltopdf/wkhtmltox/0.12.5/libwkhtmltox.so) not found in resource path
这在上面链接的最后一节中有记录,它需要这些库才能正确运行:
我修改了我的Dockerfile
以尝试在docker build上安装这些依赖项:
FROM openjdk:8-jdk-alpine
RUN sh -c 'apk update && apk add libssl1.0 libx11 libxext libxrender libstdc++ freetype fontconfig'
COPY server/target/server-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
我是docker的新手,但我在github repo的问题中找到了这段代码。但我仍然无法让它发挥作用。
你能否在这里发现我无法运行程序的问题?
我仍然得到错误java.lang.UnsatisfiedLinkError: Unable to load library '/tmp/io.woo.htmltopdf/wkhtmltox/0.12.5/libwkhtmltox.so': Native library (tmp/io.woo.htmltopdf/wkhtmltox/0.12.5/libwkhtmltox.so) not found in resource path
但是当SSH到Docker容器并查看tmp
文件夹时,会列出io.woo.htmltopdf
-library。路径tmp/io.woo.htmltopdf/wkhtmltox/0.12.5/libwkhtmltox.so
也存在于docker容器中。
它可能是路径设置的东西吗? Java应用程序没有以某种方式使用正确的路径?
正在运行的app.jar
位于根文件夹中,tmp
文件夹也位于该文件夹中 - 所以它应该找到它?
我设法通过使用本机wkhtmltopdf
库和wkhtmltopdf java wrapper来解决此问题。
我也有高山图像的问题,如果你不介意图像的大小,我会尝试使用openjdk:8
作为你提供的图像。
Alpine Linux建立在musl libc上,而不是glibc。我的猜测是你的本土图书馆与musl不兼容。
你可以试试openjdk:8-slim
。这个是基于Debian构建的,它比基于alpine的图像略大,但它可以运行为glibc构建的库。
您需要使用apt来安装其他软件包,并且需要进行一些研究以找出哪些软件包提供了您需要的库。
尝试使用以下行启动Dockerfile:
FROM openjdk:8-slim
RUN apt-get update && apt-get install -y --no-install-recommends \
libc6 \
libx11-6 \
libxext6 \
libxrender1 \
libstdc++ \
libssl1.0 \
libfreetype6 \
fontconfig \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
这会生成1.37 Gb映像,其中大部分来自libstdc ++及其所有依赖项的安装。这里可能有优化的机会(你真的需要完整的C ++ Stdlib才能让你的应用程序正常运行吗?)。如果没有此软件包,图像大小将降至256 Mb。