Node.js Docker容器中使用Selenium失败,出现Server terminated early with status 2错误
Node.js Docker容器中Selenium运行失败排查与解决
问题描述
本地正常运行的Selenium功能,部署到Node.js Docker容器后报错,提示Server terminated early with status 2。
原Dockerfile
FROM node:latest ENV NODE_ENV=production RUN apt-get update && apt-get install -y firefox-esr RUN apt-get install -y wget && \ wget https://github.com/mozilla/geckodriver/releases/download/v0.33.0/geckodriver-v0.33.0-linux64.tar.gz && \ tar -xzf geckodriver-v0.33.0-linux64.tar.gz && \ chmod +x geckodriver && \ mv geckodriver /usr/local/bin/ && \ rm geckodriver-v0.33.0-linux64.tar.gz ENV PATH="/usr/local/bin:${PATH}" WORKDIR /api COPY . . RUN npm install --production CMD ["node", "app.js"]
错误信息
/api/node_modules/selenium-webdriver/remote/index.js:260 reject(Error(e.message)) ^ Error: Server terminated early with status 2 at /api/node_modules/selenium-webdriver/remote/index.js:260:24 at process.processTicksAndRejections (node:internal/process/task_queues:95:5) Node.js v20.2.0
解决方案
1. 补充Firefox运行依赖
Docker基础镜像精简,Firefox-esr需要额外依赖才能在无图形环境运行,需安装虚拟显示服务器及系统依赖。
2. 强制Firefox无头模式运行
容器无图形界面,必须在代码中指定Firefox以无头模式启动。
修改后的Dockerfile
FROM node:latest ENV NODE_ENV=production # 安装Firefox及运行依赖 RUN apt-get update && apt-get install -y \ firefox-esr \ xvfb \ libgtk-3-0 \ libdbus-glib-1-2 \ wget && \ rm -rf /var/lib/apt/lists/* # 安装geckodriver RUN wget https://github.com/mozilla/geckodriver/releases/download/v0.33.0/geckodriver-v0.33.0-linux64.tar.gz && \ tar -xzf geckodriver-v0.33.0-linux64.tar.gz && \ chmod +x geckodriver && \ mv geckodriver /usr/local/bin/ && \ rm geckodriver-v0.33.0-linux64.tar.gz ENV PATH="/usr/local/bin:${PATH}" WORKDIR /api COPY . . RUN npm install --production # 启动虚拟显示后再运行Node应用 CMD ["sh", "-c", "Xvfb :99 -screen 0 1024x768x16 & export DISPLAY=:99 && node app.js"]
代码中配置无头模式
在Selenium初始化代码中添加无头模式参数:
const { Builder } = require('selenium-webdriver'); const firefox = require('selenium-webdriver/firefox'); async function runSelenium() { let driver = await new Builder() .forBrowser('firefox') .setFirefoxOptions(new firefox.Options().headless()) // 启用无头模式 .build(); try { // 你的业务逻辑代码 await driver.get('https://example.com'); // ... } finally { await driver.quit(); } } runSelenium();
关键说明
Xvfb用于在容器内创建虚拟显示环境,让Firefox能正常启动libgtk-3-0和libdbus-glib-1-2是Firefox运行必需的系统依赖- 无头模式+虚拟显示二者必须同时配置,缺一不可
内容的提问来源于stack exchange,提问作者Nlmyr
相关产品推荐
相关产品推荐

