并行运行Cypress Docker容器报Xvfb已运行 spawn启动失败如何解决
问题根因
你启动容器时使用了--network host参数,所有容器共享宿主机的网络命名空间。Cypress运行时默认启动的Xvfb服务会占用固定的X11监听socket/端口(默认对应DISPLAY=:0),第一个容器启动后就会抢占该资源,后续启动的容器无法再监听相同地址,因此抛出冲突错误。你执行unset DISPLAY无效,是因为Cypress 8.x版本的无头模式仍依赖Xvfb服务,会自动尝试启动并占用默认显示号,并不会因为DISPLAY变量清空就跳过Xvfb初始化。
解决方案
方案1:移除--network host参数(优先推荐)
绝大多数场景下Cypress Docker运行不需要共享宿主机网络,移除该参数后每个容器拥有独立的网络命名空间,Xvfb服务之间不会产生资源冲突,修改后的启动命令如下:
docker run -v path/to/ws:/e2e -w /e2e cypress/included:8.0.0 --spec 'cypress/integration/cytorus-cache/1.feature' docker run -v path/to/ws:/e2e -w /e2e cypress/included:8.0.0 --spec 'cypress/integration/cytorus-cache/2.feature'
建议同时添加--ipc=host或者--shm-size=2g参数,避免Cypress运行时因共享内存不足崩溃:
docker run -v path/to/ws:/e2e -w /e2e --shm-size=2g cypress/included:8.0.0 --spec 'cypress/integration/cytorus-cache/1.feature'
方案2:必须使用host网络时,为每个容器指定独立的显示号
如果你的业务场景必须使用host网络,并行启动时为每个容器分配不同的DISPLAY环境变量值即可避免冲突,示例如下:
# 第一个容器指定显示号为:10 docker run -v path/to/ws:/e2e -w /e2e --network host -e DISPLAY=:10 cypress/included:8.0.0 --spec 'cypress/integration/cytorus-cache/1.feature' # 第二个容器指定显示号为:11 docker run -v path/to/ws:/e2e -w /e2e --network host -e DISPLAY=:11 cypress/included:8.0.0 --spec 'cypress/integration/cytorus-cache/2.feature'
并行启动多个容器时,只需要依次递增显示号的数值即可。
内容的提问来源于stack exchange,提问作者Amit Kumar Gupta
相关产品推荐
相关产品推荐

