Docker环境运行Puppeteer+Jest测试报错求助
Docker环境下Jest+Puppeteer找不到Chrome的排查方案
针对本地运行正常、Docker中globalSetup阶段提示找不到Chrome的问题,按以下顺序排查解决:
1. 补全Docker镜像的Chrome系统依赖
大多数轻量Node镜像(如alpine、slim)缺少Chromium运行必需的系统库,直接运行Puppeteer会失败。
- 解决方式:
使用Debian系基础镜像手动安装依赖,或直接采用Puppeteer官方镜像puppeteer/puppeteer:FROM node:18-bullseye-slim # 安装Chromium及依赖库 RUN apt-get update && apt-get install -y --no-install-recommends \ chromium \ libnss3 \ libatk-bridge2.0-0 \ libdrm-dev \ libxkbcommon-dev \ libgbm-dev \ libasound-dev \ libatspi2.0-0 \ libxshmfence-dev \ && rm -rf /var/lib/apt/lists/*
2. 确保Puppeteer正确下载对应Chromium版本
Docker环境中npm安装时,可能因网络/权限问题跳过Chromium下载,导致版本不匹配。
- 解决方式:
- 安装阶段强制开启Chromium下载:
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=false RUN npm ci --only=production - 或直接使用系统预装的Chrome,在
jest-puppeteer.config.js中指定路径:module.exports = { launch: { executablePath: '/usr/bin/chromium', // 对应Docker内Chrome的实际路径 args: ['--no-sandbox', '--disable-setuid-sandbox'] // Docker环境必须添加的参数 } }
- 安装阶段强制开启Chromium下载:
3. 检查globalSetup的Chrome路径配置
如果globalSetup文件硬编码了本地Chrome路径,或未正确读取Puppeteer自带的Chromium路径,会导致找不到浏览器。
- 解决方式:
在globalSetup中使用Puppeteer内置的路径:
同时确认const puppeteer = require('puppeteer'); module.exports = async () => { global.__BROWSER__ = await puppeteer.launch({ executablePath: puppeteer.executablePath(), args: ['--no-sandbox', '--disable-setuid-sandbox'] }); };jest.config.js中globalSetup的路径正确:module.exports = { globalSetup: './jest.global-setup.js', preset: 'jest-puppeteer' };
4. 处理Docker容器的权限问题
非root用户运行容器时,可能没有访问Chrome的权限,或Chrome沙箱机制无法正常工作。
- 解决方式:
- 启动容器时添加
--user root参数,或在Dockerfile中指定root用户:USER root - 必须给Chrome添加
--no-sandbox和--disable-setuid-sandbox启动参数(如上述配置所示)。
- 启动容器时添加
5. 校验依赖版本兼容性
Puppeteer、Jest、jest-puppeteer版本不兼容会导致Chromium版本不匹配,引发找不到浏览器的错误。
- 解决方式:
使用以下兼容版本组合参考:
删除{ "devDependencies": { "jest": "^29.7.0", "jest-puppeteer": "^9.0.2", "puppeteer": "^21.5.2" } }node_modules和package-lock.json后重新安装依赖,再构建Docker镜像。
内容的提问来源于stack exchange,提问作者Prakashnehru
相关产品推荐
相关产品推荐

