Nest.js部署时调用puppeteer.launch出现/usr/bin/chromium-browser NOENT错误
解决思路
1. 检查并安装生产环境镜像中的Chromium
node:20.18基础镜像基于Debian,默认未预装Chromium,且Debian中Chromium的默认路径是/usr/bin/chromium(而非Ubuntu的/usr/bin/chromium-browser)。需在Dockerfile中添加安装步骤:
# 在安装npm依赖前添加以下命令 RUN apt-get update && apt-get install -y --no-install-recommends chromium \ && rm -rf /var/lib/apt/lists/*
安装完成后,修改代码中的executablePath为/usr/bin/chromium:
executablePath: process.env.NODE_ENV === 'local' ? puppeteer.executablePath() : '/usr/bin/chromium',
2. 改用puppeteer自动管理浏览器(推荐)
放弃手动指定浏览器路径,直接使用完整的puppeteer包(而非puppeteer-core),它会自动下载与当前版本兼容的Chromium,无需手动安装。
- 调整依赖:确保生产环境安装
puppeteer而非puppeteer-core - 修改代码,移除硬编码的
executablePath:
async onModuleInit() { if (this.browser) return; // 统一使用puppeteer,无需区分环境 const puppeteer = await import('puppeteer'); this.browser = await puppeteer.launch({ headless: true, args: ['--no-sandbox', '--disable-setuid-sandbox'], }); }
同时,Dockerfile需安装puppeteer运行所需的系统依赖:
RUN apt-get update && apt-get install -y --no-install-recommends \ libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 \ libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 \ libgbm1 libasound2 \ && rm -rf /var/lib/apt/lists/*
3. 使用预配置的Puppeteer官方镜像
直接基于官方提供的包含Node.js和Chromium的镜像构建项目,避免手动安装依赖的麻烦:
FROM ghcr.io/puppeteer/puppeteer:20.18.0 # 设置工作目录 WORKDIR /usr/src/app # 复制package文件并安装依赖 COPY package*.json ./ RUN npm install # 复制项目代码 COPY . . # 启动应用 CMD ["npm", "run", "start:prod"]
此时代码中无需指定executablePath,puppeteer.executablePath()会自动获取正确路径。
4. 验证路径与执行权限
若仍存在问题,可进入生产容器手动验证:
- 执行
which chromium确认浏览器实际路径 - 执行
ls -l /usr/bin/chromium确认文件存在且有执行权限
内容的提问来源于stack exchange,提问作者Ryan Cheung
相关产品推荐
相关产品推荐

