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

在Docker容器中运行Cucumber与Capybara时Chrome崩溃问题排查

解决Docker中Capybara+ChromeDriver启动崩溃的问题

我来帮你排查这个Chrome启动崩溃的问题,这类问题在Docker无桌面环境里特别常见,大多和Chrome的启动模式、用户权限或者运行时机有关。

问题背景

你维护着一个基于Cucumber(Ruby)+Capybara+ChromeDriver的端到端测试仓库,想要通过Docker容器自动化运行测试。你选用了2glab/ruby-chrome-driver镜像编写Dockerfile,但运行时遇到Chrome启动崩溃的错误:

unknown error: Chrome failed to start: crashed (Driver info: chromedriver=2.37.544315 (730aa6a5fdba159ac9f4c1e8cbc59bf1b5ce12b7),platform=Linux 4.9.87-linuxkit-aufs x86_64) (Selenium::WebDriver::Error::UnknownError

你当前的Dockerfile内容如下:

FROM 2glab/ruby-chrome-driver 
RUN \ 
  apt-get update && \ 
  apt-get install -qy bundler && \ 
  apt-get install -qy cucumber 
RUN useradd -d /home/<user> -ms /bin/bash -g root -G sudo -p <user> <password> 
USER <user> 
WORKDIR /home/<user> 
RUN cd && git clone <my_repo_url> 
WORKDIR <my_repo_folder> 
RUN bundle install && bundle exec cucumber 

问题根源分析

虽然你用的镜像已经包含Chrome和ChromeDriver,但Docker环境是无图形界面的,再加上你的Dockerfile存在几个关键问题:

  1. Chrome未启用无头模式:Chrome默认需要图形界面才能启动,无桌面环境下必须开启无头模式,否则直接崩溃
  2. 测试执行时机错误:你在RUN阶段执行测试,这是镜像构建时的操作,此时容器没有合适的运行环境(比如缺少虚拟显示支持),测试应该在容器启动时执行
  3. 用户权限冗余:创建的用户赋予了sudo权限,反而可能导致Chrome运行时的权限冲突,普通权限足够测试运行

解决方案

1. 修改Capybara配置,强制启用Chrome无头模式

在你的测试代码的Capybara配置文件(通常是features/support/env.rb)中,添加Chrome无头模式的启动参数,同时解决Docker特有的权限和资源限制问题:

Capybara.register_driver :chrome do |app|
  options = Selenium::WebDriver::Chrome::Options.new(args: [
    'headless',          # 无头模式,无需图形界面
    'disable-gpu',       # 禁用GPU加速,适配无桌面环境
    'no-sandbox',        # 绕过Chrome的沙箱机制,解决普通用户权限问题
    'disable-dev-shm-usage' # 避免Docker中/dev/shm空间不足导致的崩溃
  ])
  Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
end

Capybara.default_driver = :chrome
Capybara.javascript_driver = :chrome

2. 优化Dockerfile,修复执行逻辑和权限

调整Dockerfile,修正测试执行时机、用户权限,同时清理冗余操作:

FROM 2glab/ruby-chrome-driver

# 安装依赖(先确认原镜像是否已包含bundler/cucumber,避免重复安装引发冲突)
RUN apt-get update && \
    apt-get install -qy --no-install-recommends bundler cucumber && \
    rm -rf /var/lib/apt/lists/* # 清理APT缓存,减小镜像体积

# 创建普通测试用户,无需sudo权限
RUN useradd -m -s /bin/bash tester

# 设置工作目录并拉取代码仓库
WORKDIR /home/tester
RUN git clone <integration-test-repo-url> integration-test-repo

# 提前安装Gem依赖(构建阶段完成,避免每次启动容器都重复安装)
WORKDIR /home/tester/integration-test-repo
RUN bundle install --without development test # 根据你的Gemfile调整参数

# 切换到普通用户
USER tester

# 设置容器启动时执行测试脚本(而非构建阶段)
CMD ["./runtests.sh"]

3. 额外检查项

  • 版本兼容性:确保Chrome和ChromeDriver版本匹配,你的错误日志中ChromeDriver是2.37,对应的Chrome版本应为64-66。可以在镜像中执行google-chrome --version和chromedriver --version确认版本是否匹配
  • 虚拟显示(可选):如果部分测试必须依赖图形界面,可以安装xvfb,并将启动命令改为xvfb-run -a ./runtests.sh,不过无头模式已经能覆盖绝大多数测试场景

按照上述步骤调整后,应该就能解决Chrome启动崩溃的问题了。

内容的提问来源于stack exchange,提问作者Arnab Datta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:02:38