You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Docker容器中运行wkhtmltopdf-amd64二进制文件返回127 'Not found'错误的问题求助

解决Docker容器内wkhtmltopdf-amd64报"Not found"(127错误)的问题

碰到这种明明文件就在眼前,却弹出127“Not found”错误的情况,是不是特别困惑?其实这个错误不一定是文件真的找不到,更常见的原因是二进制文件缺少必要的系统依赖库,或者容器的基础镜像和这个二进制的架构/依赖体系不兼容。下面给你一步步排查解决:

1. 先确认容器架构是否匹配

首先得搞清楚你的Docker容器是不是amd64(x86_64)架构的,毕竟你用的是wkhtmltopdf-amd64

docker exec -it php uname -m

如果输出不是x86_64,那说明容器架构和二进制文件不匹配,要么换amd64架构的基础镜像,要么找对应架构的wkhtmltopdf版本。

2. 安装wkhtmltopdf必需的系统依赖

如果架构没问题,那大概率是缺依赖了,不同基础镜像的安装方式不一样:

如果你用的是Debian/Ubuntu系的PHP镜像(比如php:7.4-fpm)

直接在容器里装这些依赖就行,也可以加到Dockerfile里让构建时自动安装:

apt-get update && apt-get install -y libxrender1 libfontconfig1 libxext6 libjpeg62-turbo libpng16-16

如果你用的是Alpine系的PHP镜像(比如php:7.4-fpm-alpine)

Alpine用的是musl libc,而wkhtmltopdf-amd64是基于glibc编译的,直接跑肯定找不到依赖。有两个解决办法:

  • 最简单的:换成Debian/Ubuntu系的PHP镜像,省得折腾兼容层
  • 非要用Alpine的话,装glibc兼容层:
    apk add --no-cache libstdc++
    wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub
    wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.34-r0/glibc-2.34-r0.apk
    apk add glibc-2.34-r0.apk
    
    装完再试试运行wkhtmltopdf-amd64

3. 确保PHP代码里的路径是容器内的绝对路径

别把WSL里的本地路径写到PHP代码里,一定要用容器内的绝对路径,比如/var/www/html/vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64。要是不确定路径对不对,可以在PHP里加几行调试代码:

<?php
echo "当前工作目录: " . getcwd() . PHP_EOL;
$wkPath = '/var/www/html/vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64';
echo "要执行的文件路径: " . $wkPath . PHP_EOL;
// 检查文件是否存在且可执行
if (is_executable($wkPath)) {
    echo "文件可执行" . PHP_EOL;
} else {
    echo "文件不可执行或不存在" . PHP_EOL;
}
// 尝试执行
exec($wkPath . ' --version', $output, $returnCode);
echo "返回码: " . $returnCode . PHP_EOL;
print_r($output);
?>

4. 再确认下文件的可执行权限

虽然你已经看到权限是-rwxr-xr-x,但保险起见可以再手动赋一次权限:

chmod +x /var/www/html/vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64

终极排查:用ldd找缺失的依赖

要是上面的步骤都试过还不行,用ldd命令看看这个二进制依赖的库哪些找不到:

ldd /var/www/html/vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64

输出里标着not found的就是你要补的库,对应安装就行。


内容的提问来源于stack exchange,提问作者Magmatic

火山引擎 最新活动