Java - Docker 安装依赖项失败 - Html2Pdf 库
Java - Docker fails to install dependencies - Html2Pdf library
我正在构建一个 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
这在上面 link 的最后一节中有记录,它需要这些库才能 运行 正确:
- libc6(或 glibc)libx11 libxext libxrender libstdc++ libssl1.0
freetype 字体配置
我修改了我的 Dockerfile
以尝试在 docker 构建中安装这些依赖项:
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
- 库。路径 tmp/io.woo.htmltopdf/wkhtmltox/0.12.5/libwkhtmltox.so
也存在于 docker 容器中。
会不会是路径设置的问题? Java 应用程序没有使用正确的路径?
正在 运行 的 app.jar
位于根文件夹中,tmp
文件夹也位于根文件夹中 - 所以它应该找到它?
我也遇到过 alpine 图片的问题,如果你不介意图片的大小,我会尝试使用 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。
我设法通过将本机 wkhtmltopdf
库与 wkhtmltopdf java wrapper 一起使用来解决此问题。
我遇到了同样的问题,顺便说一下,我使用 htmltopdf
版本 1.0.8
但它在 mac os 上工作,但是当我使用图像 [=14] =] 它不工作,然后我尝试将版本降低到 1.0.6
,它正在工作
改变
compile group: 'io.woo', name: 'htmltopdf', version: '1.0.8'
至
compile group: 'io.woo', name: 'htmltopdf', version: '1.0.6'
我正在构建一个 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
这在上面 link 的最后一节中有记录,它需要这些库才能 运行 正确:
- libc6(或 glibc)libx11 libxext libxrender libstdc++ libssl1.0 freetype 字体配置
我修改了我的 Dockerfile
以尝试在 docker 构建中安装这些依赖项:
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
- 库。路径 tmp/io.woo.htmltopdf/wkhtmltox/0.12.5/libwkhtmltox.so
也存在于 docker 容器中。
会不会是路径设置的问题? Java 应用程序没有使用正确的路径?
正在 运行 的 app.jar
位于根文件夹中,tmp
文件夹也位于根文件夹中 - 所以它应该找到它?
我也遇到过 alpine 图片的问题,如果你不介意图片的大小,我会尝试使用 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。
我设法通过将本机 wkhtmltopdf
库与 wkhtmltopdf java wrapper 一起使用来解决此问题。
我遇到了同样的问题,顺便说一下,我使用 htmltopdf
版本 1.0.8
但它在 mac os 上工作,但是当我使用图像 [=14] =] 它不工作,然后我尝试将版本降低到 1.0.6
,它正在工作
改变
compile group: 'io.woo', name: 'htmltopdf', version: '1.0.8'
至
compile group: 'io.woo', name: 'htmltopdf', version: '1.0.6'