You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 08:15:51