【问题标题】:Java - Docker fails to install dependencies - Html2Pdf libraryJava - Docker 无法安装依赖项 - Html2Pdf 库
【发布时间】:2019-03-06 10:00:38
【问题描述】:

我正在构建一个将托管在 docker 容器中的 Java 应用程序。这个应用程序的一部分是使用这个库:

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

这在上面链接的最后一节中有记录,它需要这些库才能正确运行:

  • libc6(或 glibc) libx11 libxext libxrender libstdc++ libssl1.0 freetype 字体配置

我已修改我的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 的问题中发现了这个 sn-p 代码。但我仍然无法让它工作。

您能在此处发现为什么我无法运行该程序的问题吗?

编辑:

我仍然收到错误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 文件夹也位于该文件夹中 - 所以它应该找到它吗?

【问题讨论】:

  • 你能给我提供 jar 和除构建图像之外的任何其他步骤,以便我可以测试吗?

标签: java spring docker dockerfile html2pdf


【解决方案1】:

我遇到了同样的问题,顺便说一下,我使用了htmltopdf 版本1.0.8,但它在mac os 上运行,但是当我使用图像docker.io/fabric8/s2i-java:3.0-java8 时它不起作用,然后我尝试将版本降低到1.0.6它正在工作

改变

compile group: 'io.woo', name: 'htmltopdf', version: '1.0.8' 

compile group: 'io.woo', name: 'htmltopdf', version: '1.0.6'

【讨论】:

    【解决方案2】:

    我设法通过使用本机 wkhtmltopdf 库和 wkhtmltopdf java wrapper 来解决这个问题。

    【讨论】:

      【解决方案3】:

      我对 alpine 图片也有问题,如果您不介意图片的大小,我会尝试使用 openjdk:8 作为您提供的图片。

      【讨论】:

      • 您好,感谢您的回复。当使用 openjdk:8 时,我得到了错误 sh: 1: apk: not found 。在没有apk add 命令的情况下运行应用程序时,我仍然会得到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
      【解决方案4】:

      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。

      【讨论】:

      • 您好,感谢您的回复。我已经尝试了上面的解决方案,但我仍然收到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 容器时,wkhtmltopdf 依赖项位于 tmp/ 文件夹中,所以我不明白为什么我不断收到此错误。
      • 可能您的 libwkhtmltox.so 缺少其依赖项之一。运行objdump -p libwkhtmltox.so 以检查所需的库,并确保已安装所有库。您可能需要在 apt-get install 命令中添加另一个包。
      猜你喜欢
      • 1970-01-01
      • 2014-08-23
      • 1970-01-01
      • 2016-02-06
      • 2020-05-26
      • 1970-01-01
      • 2021-05-29
      • 2018-09-11
      • 2018-05-30
      相关资源
      最近更新 更多