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

Docker Compose运行多个Cypress套件仅单套执行Xvfb报错如何解决

问题根因

你碰到的Xvfb启动报错,核心诱因是两个Cypress服务都配置了network_mode: host,直接共享宿主机网络命名空间。Cypress默认启动Xvfb虚拟显示服务时会绑定DISPLAY=:99对应的端口,先启动的suite1会独占这个端口,后启动的suite2无法绑定同一端口直接退出,和你用的镜像差异、工作目录挂载路径没有关系。

排查步骤
  • 单独启动suite2容器,如果可以正常执行用例,同时启动两个容器就复现Xvfb报错,即可100%确认是端口抢占问题
  • 分别进入两个运行中的容器打印DISPLAY环境变量,会发现默认值都是:99,host模式下网络栈不隔离,同一端口只能被一个进程占用
  • 任意单个套件单独运行都正常的话,直接排除Xvfb安装损坏、/dev/shm权限不足、系统依赖缺失类问题
解决方案

按优先级选择即可:

方案1:移除host网络模式(优先推荐)

绝大多数场景下Cypress测试不需要用host网络,去掉network_mode: host配置后,Docker会给每个容器分配独立的网络栈,两个容器内的Xvfb各自使用自己的99端口,完全不会冲突。
你当前配置里把同一份本地代码分别挂载到/test和/test1、用两个不同的镜像cyp1/cyp2都是冗余操作,两个套件可以共用同一个Cypress镜像、同一个挂载路径,修正后的配置参考:

version: '3.2'
services:
  suite1:
    container_name: suite1
    image: 'cypress/included:12.17.4' # 替换为你实际使用的Cypress版本镜像即可,两个套件无需分开构建镜像
    environment:
      - CYPRESS_environment=test
    working_dir: /test
    volumes:
      - ./:/test
      - /dev/shm:/dev/shm
    command: '--browser chrome --spec cypress/integration/wfo/speech-iq/configuration/**'
  suite2:
    container_name: suite2
    image: 'cypress/included:12.17.4'
    environment:
      - CYPRESS_environment=test
    working_dir: /test
    volumes:
      - ./:/test
      - /dev/shm:/dev/shm
    command: '--browser chrome --spec cypress/integration/siq/speech-iq/configuration/**'

配置完成后直接执行docker compose up就能并行启动两个测试套件。

方案2:必须保留host网络时手动分配不同DISPLAY端口

如果你的测试场景必须依赖host网络(比如被测服务直接绑定宿主机127.0.0.1,且没有配置容器网络访问通道),可以给两个容器手动指定不同的DISPLAY环境变量,让Xvfb绑定不同端口避免冲突:

  • 在suite1的environment配置块下新增一行:- DISPLAY=:99
  • 在suite2的environment配置块下新增一行:- DISPLAY=:100
    两个Xvfb进程会分别监听99、100对应的显示端口,不会再出现抢占问题。

方案3:使用无头模式跳过Xvfb启动

如果不需要有头浏览器的调试能力,直接在启动参数里加上--headless参数,Cypress会直接启动无头版Chrome,完全不会启动Xvfb虚拟显示服务,从根源上规避这类冲突,同时运行性能也会更高。两个服务的command修改示例:

  • suite1: '--browser chrome --headless --spec cypress/integration/wfo/speech-iq/configuration/**'
  • suite2: '--browser chrome --headless --spec cypress/integration/siq/speech-iq/configuration/**'
并行运行注意事项
  • 两个套件并行执行时,截图、录屏、测试报告的输出路径不要指向同一个宿主机目录下的同名文件,否则会出现文件覆盖、写入冲突导致报告损坏
  • 宿主机/dev/shm分区建议预留至少2G以上可用空间,Chrome运行时会占用较多共享内存,并行场景下空间不足会直接导致浏览器崩溃
  • 不需要为不同测试套件单独构建Cypress镜像,通过--spec参数指定不同用例路径即可覆盖不同套件的执行需求,能大幅降低镜像维护成本

内容的提问来源于stack exchange,提问作者Shreyas Murali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:45:33