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.apkwkhtmltopdf-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




