3

我有一个运行 debian buster 的 docker 容器,我想在其中运行 wkhtmltopdf。我有 2 台主机,它们都是相同的,都使用相同的 Dockerfile 运行相同的容器构建。两者都运行相同版本的 docker。在一台机器上 wkhtmltopdf 工作正常,但在另一台机器上我得到:

wkhtmltopdf: error while loading shared libraries: libQt5Core.so.5: cannot open shared object file: No such file or directory

在它工作的机器上:

# ldd /usr/bin/wkhtmltopdf | grep libQt5Core
 libQt5Core.so.5 => /lib/x86_64-linux-gnu/libQt5Core.so.5 (0x00007f8da6f2f000)

# ls -l /lib/x86_64-linux-gnu/libQt5Core.so.5*
lrwxrwxrwx. 1 root root      19 Dec  4  2017 /lib/x86_64-linux-gnu/libQt5Core.so.5 -> libQt5Core.so.5.9.2
lrwxrwxrwx. 1 root root      19 Dec  4  2017 /lib/x86_64-linux-gnu/libQt5Core.so.5.9 -> libQt5Core.so.5.9.2
-rw-r--r--. 1 root root 5138560 Dec  4  2017 /lib/x86_64-linux-gnu/libQt5Core.so.5.9.2

在它不起作用的机器上:

# ldd /usr/bin/wkhtmltopdf | grep libQt5Core
 libQt5Core.so.5 => not found

# ls -l /lib/x86_64-linux-gnu/libQt5Core.so.5*
lrwxrwxrwx. 1 root root      20 Nov 18 16:36 /lib/x86_64-linux-gnu/libQt5Core.so.5 -> libQt5Core.so.5.11.2
lrwxrwxrwx. 1 root root      20 Nov 18 16:36 /lib/x86_64-linux-gnu/libQt5Core.so.5.11 -> libQt5Core.so.5.11.2
-rw-r--r--. 1 root root 5196040 Nov 18 16:36 /lib/x86_64-linux-gnu/libQt5Core.so.5.11.2

现在我没有显式安装 Qt - 我假设它是作为 wkhtmltopdf 的依赖项安装的。

以下是所有内容的版本,在两台机器上都相同:

内部容器:

# cat /etc/debian_version 
buster/sid
# wkhtmltopdf -V          
wkhtmltopdf 0.12.4

外箱:

# cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 7.6 (Maipo)
# docker -v
Docker version 17.06.2-ee-18, build c78b5e1

任何人都知道发生了什么以及我如何让它工作?

为什么libQt5Core的版本不一样?为什么在非工作机器上找不到它。

我确实尝试将 libQt5Core.so.5.9 从工作机器复制并链接到非工作机器,但这并没有解决它。

这真的让我很烦恼。

4

1 回答 1

2

问题是 libQt5Core 共享库和正在运行的内核之间的兼容性问题。wkhtmltopdf 不起作用的 RHEL 系统运行的内核版本早于 3.17。

在 Docker 容器中,.note.ABI-tag从共享库中删除 ELF 部分,wkhtmltopdf 将起作用:

strip -R .note.ABI-tag /lib64/libQt5Core.so.5.11.3

strip工具可能不包含在您的 Docker 容器中。您可能需要安装该binutils软件包。

于 2019-03-28T16:09:09.443 回答