在Node Docker容器中运行Puppeteer时Chromium找不到的问题排查
Node.js Puppeteer在Azure App Service Docker容器中找不到Chromium的问题
本地MAC OS环境运行正常,但部署到Azure App Service的Docker容器后,触发Puppeteer时出现以下错误:
Error: Could not find Chromium (rev. 1069273). This can occur if either 1. you did not perform an installation before running the script (e.g. `npm install`) or 2. your cache path is incorrectly configured (which is: /root/.cache/puppeteer). For (2), check out our guide on configuring puppeteer at https://pptr.dev/guides/configuration.
提供的配置文件
Dockerfile
FROM node:slim ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD true # INSTALL PUPPETEER DEPENDENCIES RUN apt-get update && apt-get install gnupg wget chromium -y && \ wget --quiet --output-document=- https://dl-ssl.google.com/linux/linux_signing_key.pub | gpg --dearmor > /etc/apt/trusted.gpg.d/google-archive.gpg && \ sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' && \ apt-get update && \ apt-get install google-chrome-stable -y --no-install-recommends && \ rm -rf /var/lib/apt/lists/* COPY ./backend/ . RUN npm install CMD ["npm", "start"]
路由代码
import puppeteer from 'puppeteer'; ... const browser = await puppeteer.launch({ headless: true, ignoreHTTPSErrors: true, executablePath: '/usr/bin/google-chrome' })
package.json
"dependencies": { ... "puppeteer": "^19.4.1", }
问题原因及修复方案
核心问题
虽然通过PUPPETEER_SKIP_CHROMIUM_DOWNLOAD跳过了Puppeteer自带Chromium的下载,也手动安装了google-chrome-stable,但Puppeteer仍在尝试查找它预期版本的Chromium(1069273),而非使用你手动安装的Chrome。此外还有两处关键问题:
- 安装了冗余的
chromium包,且指定的executablePath可能与实际Chrome路径不匹配 - Puppeteer版本与手动安装的Chrome版本不兼容,导致Puppeteer无法识别该Chrome实例
具体修复步骤
1. 修正Dockerfile,清理冗余依赖并配置环境变量
修改Dockerfile,移除多余的chromium安装,通过环境变量指定Chrome路径,同时优化依赖安装:
FROM node:slim # 跳过Puppeteer自带Chromium下载,指定手动安装的Chrome路径 ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/google-chrome-stable # 安装Chrome依赖及稳定版Chrome RUN apt-get update && apt-get install -y --no-install-recommends \ ca-certificates \ wget \ gnupg \ && wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | gpg --dearmor -o /etc/apt/trusted.gpg.d/google.gpg \ && sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \ && apt-get update \ && apt-get install -y --no-install-recommends google-chrome-stable \ && apt-get purge -y --auto-remove wget gnupg \ && rm -rf /var/lib/apt/lists/* COPY ./backend/ . RUN npm install CMD ["npm", "start"]
2. 调整Puppeteer启动配置
移除手动指定的executablePath,改用环境变量配置,同时添加容器环境必需的启动参数:
import puppeteer from 'puppeteer'; ... const browser = await puppeteer.launch({ headless: 'new', // Puppeteer 19+推荐使用新无头模式 ignoreHTTPSErrors: true, args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', // 解决容器内存不足问题 '--disable-gpu' // 无GPU环境禁用 ] })
3. 确保Puppeteer与Chrome版本兼容
Puppeteer 19.4.1对应Chromium版本为106.x,而google-chrome-stable默认安装最新稳定版,版本不匹配会导致识别失败。可通过以下方式解决:
- 查询Puppeteer 19.4.1对应的Chrome版本,安装对应版本的Chrome
- 升级Puppeteer到最新版本,确保与安装的Chrome版本兼容
额外注意事项
- Azure App Service容器环境必须启用无沙箱模式,因此启动参数中必须包含
--no-sandbox和--disable-setuid-sandbox - 添加
--disable-dev-shm-usage可避免容器中共享内存空间不足导致Chrome崩溃
内容的提问来源于stack exchange,提问作者Nico Schuck
相关产品推荐
相关产品推荐

