Node.js环境Cloud Run运行Selenium的ChromeDriver报错修复
结论
Google Cloud Run 完全可以正常运行Selenium服务,你遇到的驱动找不到报错是容器镜像缺少Chrome和ChromeDriver依赖导致的,和Cloud Run平台本身无关。
报错核心原因:Cloud Run基于容器运行,你当前部署的镜像只打包了Node.js代码和npm依赖,没有预装Chrome/Chromium浏览器、对应版本的ChromeDriver,Selenium初始化时无法在系统PATH中找到驱动可执行文件,因此抛出异常。
修复步骤
1. 编写正确的Dockerfile打包所有依赖
Cloud Run部署依赖容器镜像,你需要在项目根目录创建Dockerfile,在构建阶段把Chrome、匹配版本的ChromeDriver和系统依赖全部打入镜像,不需要手动下载管理驱动版本,参考配置如下:
FROM node:20-bullseye-slim # 安装系统依赖、Chrome稳定版、匹配版本的ChromeDriver RUN apt-get update \ && apt-get install -y wget gnupg ca-certificates \ && wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | gpg --dearmor -o /usr/share/keyrings/googlechrome-linux-keyring.gpg \ && echo "deb [arch=amd64 signed-by=/usr/share/keyrings/googlechrome-linux-keyring.gpg] http://dl.google.com/linux/chrome/deb/ stable main" | tee /etc/apt/sources.list.d/google-chrome.list \ && apt-get update \ && apt-get install -y google-chrome-stable chromium-driver fonts-noto-cjk \ && rm -rf /var/lib/apt/lists/* WORKDIR /app # 优先拷贝依赖文件利用Docker构建缓存 COPY package*.json ./ RUN npm ci --only=production COPY . . EXPOSE 8080 CMD ["node", "index.js"]
注:安装fonts-noto-cjk是为了避免访问中文页面时出现方块乱码,不需要可以删掉。
2. 调整现有代码适配容器运行环境
你现有代码有两处需要调整:
- 补全未定义的
timeoutMS变量 - 增加容器环境必需的Chrome启动参数,显式指定Chrome二进制路径
调整后的接口逻辑参考:
// 定义Selenium操作超时时间,单位毫秒 const timeoutMS = 10000; app.get('/', async (req, res) => { const options = new Options(); options.addArguments('--disable-dev-shm-usage') options.addArguments('--no-sandbox') options.addArguments('--headless=new') options.addArguments('--disable-gpu') options.addArguments('--disable-extensions') options.addArguments("--start-maximized"); // 显式指定Chrome二进制路径,避免环境差异导致找不到浏览器 options.setBinary('/usr/bin/google-chrome'); let driver; try { driver = await new Builder().forBrowser(Browser.CHROME).setChromeOptions(options).build(); await driver.manage().window().setRect({ width: 3840, height: 2160, x: 0, y: 0 }); await driver.get('https://google.com'); await driver.sleep(1000) const pageSource = await driver.wait(until.elementLocated(By.css('body')), timeoutMS).getAttribute('innerHTML'); res.send(`Hello selenium!` + pageSource); } catch (err) { res.status(500).send(`Run error: ${err.message}`); } finally { // 记得退出driver,避免进程残留占用内存 if (driver) await driver.quit(); } });
补充:加finally块退出driver是必须的,不然每次请求残留一个Chrome进程,很快会因为内存不足导致服务崩溃。
3. 部署注意事项
- 如果你在本地(尤其是M系列芯片的Mac)构建镜像推送到Cloud Run,构建时需要指定amd64架构,避免架构不兼容无法运行,构建命令参考:
docker build --platform linux/amd64 -t gcr.io/你的GCP项目ID/selenium-api . - Cloud Run默认分配的256M内存不足以运行Chrome,部署时至少把内存调整到1G,复杂页面渲染、截图场景建议调到2G。
- 不需要额外配置PATH环境变量,上述Dockerfile安装的ChromeDriver会自动加入系统路径,Selenium可以直接识别。
内容的提问来源于stack exchange,提问作者user567
相关产品推荐
相关产品推荐

