Laravel Sail中Puppeteer调用Chrome失败问题求助
解决Docker中Laravel生成PDF找不到Chrome的问题
1. 定位容器内Chrome的实际路径
先在Docker容器里执行命令,找到Chrome的安装路径:
which chrome # 或者针对Chromium which chromium-browser
常见路径包括 /usr/bin/chromium-browser 或 Puppeteer自带的路径 /node_modules/puppeteer/.local-chromium/linux-*/chrome-linux/chrome
2. 给Laravel的PDF生成工具指定Chrome路径
如果用的是Spatie Browsershot(主流的Puppeteer-based Laravel PDF工具),有两种配置方式:
代码内直接指定
修改你的PDF生成代码,添加Chrome路径配置:
use Spatie\Browsershot\Browsershot; Browsershot::html(view($layout, ['invoice' => $invoice])->render()) ->setChromePath('/usr/bin/chromium-browser') // 替换为你找到的实际路径 ->setOption('args', ['--no-sandbox', '--disable-setuid-sandbox']) ->save(storage_path("app/public/{$path}/invoice_{$invoice['invoice_number']}.pdf"));
全局环境变量配置
在.env文件中添加:
BROWSERSHOT_CHROME_PATH=/usr/bin/chromium-browser
如果还没发布Browsershot配置,先执行:
php artisan vendor:publish --provider="Spatie\Browsershot\BrowsershotServiceProvider"
然后在config/browsershot.php中对应位置修改:
'chrome_path' => env('BROWSERSHOT_CHROME_PATH', null),
3. 检查Puppeteer脚本的路径配置
如果是自定义Node脚本调用Puppeteer,确保脚本里明确指定Chrome的executablePath:
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch({ executablePath: '/usr/bin/chromium-browser', // 替换为实际路径 args: ['--no-sandbox', '--disable-setuid-sandbox'] }); // 生成PDF的逻辑 await browser.close(); })();
4. 验证文件权限
确保Laravel运行用户(通常是www-data)能访问Chrome可执行文件,执行:
chmod +x /usr/bin/chromium-browser
5. 确认版本兼容性
检查你用的Laravel PDF工具(比如Browsershot)是否支持当前Chrome版本(135.0.7049.84),版本不兼容的话,升级或降级对应包即可。
内容的提问来源于stack exchange,提问作者Urek Mazino
相关产品推荐
相关产品推荐

