我正在使用 Nest.js 开发一个具有生成 PDF 文档功能的项目。我正在使用 puppeteer 库通过 API 生成 PDF https://pptr.dev/api/puppeteer.page.pdf
它可以在本地与 Ubuntu 等 docker 操作系统配合良好。我设置的chromium路径是/usr/bin/chromium-browser。
但是,当我使用 docker OS 作为节点:20.18 部署到生产时,似乎该设置不起作用,因为在日志中发现 /usr/bin/chromium-browser NOENT 错误。
启动puppeteer浏览器的代码:
export class BrowserService implements OnModuleInit, OnModuleDestroy {
private browser: puppeteerCore.Browser | Browser;
async onModuleInit() {
if (this.browser) return;
const puppeteer = process.env.NODE_ENV === 'local' ? puppeteerFull : puppeteerCore;
this.browser = await puppeteer.launch({
executablePath: process.env.NODE_ENV === 'local' ? puppeteer.executablePath() : '/usr/bin/chromium-browser',
headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox'],
});
}
getBrowser() {
return this.browser;
}
}
Nest 应用程序服务器日志显示 NOENT 错误,如下所示:
Error: Failed to launch the browser process! spawn /usr/bin/chromium-browser ENOENT
TROUBLESHOOTING: https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md
at onClose (/usr/src/app/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserRunner.js:299:20)
at ChildProcess.<anonymous> (/usr/src/app/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserRunner.js:293:24)
at ChildProcess.emit (node:events:519:28)
at ChildProcess.emit (node:domain:488:12)
at ChildProcess._handle.onexit (node:internal/child_process:292:12)
at onErrorNT (node:internal/child_process:484:16)
at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
WARN received SIGTERM indicating exit request
INFO waiting for 01-node_00, 02-java_00 to die
WARN stopped: 02-java_00 (exit status 143)
WARN stopped: 01-node_00 (terminated by SIGTERM)
有人知道如何解决这个问题吗?
docker操作系统的差异是我能想到的唯一原因。感谢有人能给我一些指导。
我认为可执行文件路径应该根据docker容器内的主机操作系统进行调整。
“/usr/bin/chromium-browser”适用于 Ubuntu 操作系统。
对于node:20.18,它应该是一个alpine操作系统,所以也许你可以尝试将executablePath更改为'/usr/bin/chromium'?