Laravel使用Spatie/Browsershot报错:npm&node未找到(Docker环境)
解决方案:Docker环境下Spatie/Browsershot的node/npm找不到及Puppeteer漏洞问题
一、解决node/npm未找到的问题
1. 确认Node.js的实际路径
在Laradock的workspace容器内执行命令,获取node和npm的真实路径:
which node which npm
你会得到类似输出:
/home/laradock/.nvm/versions/node/v20.0.0/bin/node /home/laradock/.nvm/versions/node/v20.0.0/bin/npm
你之前指定的/usr/bin/node是错误路径,这是核心问题所在。
2. 正确配置Browsershot的Node路径
修改代码,使用实际获取到的node/npm路径,同时注意Docker环境必须添加noSandbox参数:
use Spatie\Browsershot\Browsershot; Browsershot::html('testing') ->setNodeBinary('/home/laradock/.nvm/versions/node/v20.0.0/bin/node') ->setNpmBinary('/home/laradock/.nvm/versions/node/v20.0.0/bin/npm') ->noSandbox() ->save(public_path('assets/pdfs/example.pdf'));
推荐用public_path()代替硬编码的/public/,避免因容器路径映射导致的错误。
3. 确保PHP进程能访问Node路径
如果是通过Laradock的php-fpm容器而非workspace执行代码,需额外配置:
- 编辑
laradock/php-fpm/Dockerfile,添加Node路径到环境变量:ENV PATH="/home/laradock/.nvm/versions/node/v20.0.0/bin:${PATH}" - 重新构建并启动php-fpm容器:
docker-compose build php-fpm docker-compose up -d php-fpm
4. 验证Node可访问性
在Laravel路由/控制器中执行以下代码,测试PHP进程能否调用Node:
$output = shell_exec('which node 2>&1'); dd($output);
输出正确的Node路径则说明环境配置生效。
二、解决Puppeteer依赖弃用及漏洞问题
1. 用--legacy-peer-deps安装Puppeteer
重新安装时忽略peer依赖冲突,解决大部分弃用提示:
npm install puppeteer --legacy-peer-deps
2. 锁定稳定版本的Puppeteer
选择维护状态良好的稳定版本,减少漏洞数量:
npm install puppeteer@21.7.0 --legacy-peer-deps
新版本会修复已知高危漏洞,尽量避免使用过旧版本。
3. 忽略非核心漏洞
部分漏洞属于开发依赖或非功能性依赖,不会影响PDF生成的核心功能。执行npm audit查看漏洞详情:
- 若漏洞位于
devDependencies中,可直接忽略 - 低风险漏洞无需强制修复,不影响生产环境
4. 用Puppeteer官方镜像隔离环境(可选)
不想在Laradock容器内维护Node环境的话,可以单独启动Puppeteer服务,让Browsershot远程调用:
- 启动Puppeteer容器:
docker run -d --name puppeteer-chrome -p 3000:3000 ghcr.io/puppeteer/puppeteer:latest - 修改Browsershot代码使用远程Chrome:
Browsershot::html('testing') ->setRemoteInstance('http://puppeteer-chrome:3000') ->save(public_path('assets/pdfs/example.pdf'));
内容的提问来源于stack exchange,提问作者Paul Godard
相关产品推荐
相关产品推荐

