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

Docker容器中运行pytest出现Segmentation Fault问题求助

Docker容器运行pytest触发Segmentation Fault的解决办法

问题分析

本地运行pytest完全正常,但Docker容器中执行时触发Segmentation Fault。从报错栈和加载的扩展模块(PySide6相关)可以判断:测试中涉及Qt6 GUI组件,而Docker容器默认没有X11显示环境,Qt无法初始化图形界面导致崩溃。

解决方案

1. 安装虚拟显示服务Xvfb

在Dockerfile中添加Xvfb的安装步骤,让Qt可以在虚拟显示环境中运行。修改后的Dockerfile如下:

# Use the official Python base image
FROM python:3.11-bullseye

# 安装系统依赖:Qt6依赖 + Xvfb虚拟显示
COPY debPackages.txt .
RUN apt-get update && \
    apt-get install $(grep -vE "^\s*#" debPackages.txt  | tr "\n" " ") xvfb -y && \
    rm -rf /var/lib/apt/lists/*  # 清理apt缓存减小镜像体积

# 设置工作目录
WORKDIR /app

# 安装Python依赖
COPY requirements.txt .
RUN pip install --upgrade pip && \
    pip install numpy setuptools --no-cache-dir && \
    pip install --no-cache-dir -r requirements.txt

# 复制项目文件(已包含tests目录,无需单独复制)
COPY . .

ENV PYTHONDONTWRITEBYTECODE=true

EXPOSE 8000

# 用xvfb-run包裹测试命令,提供虚拟显示
CMD ["xvfb-run", "--auto-servernum", "coverage", "run", "-m", "pytest"]

2. 优化说明

  • 合并pip安装命令,减少镜像构建层数
  • 添加rm -rf /var/lib/apt/lists/*清理apt缓存,缩小镜像体积
  • 移除重复的COPY ./tests ./tests,因为COPY . .已包含整个项目目录
  • 使用xvfb-run --auto-servernum自动分配显示端口,无需手动指定

3. 重新构建并运行

执行以下命令重新构建镜像并运行测试:

sudo docker build -f docker/Dockerfile --tag merlot .
sudo docker run merlot:latest

额外排查方向

如果问题仍存在,可尝试:

  • 检查debPackages.txt是否缺少Qt6图形相关依赖
  • 在容器中添加环境变量QT_QPA_PLATFORM=offscreen,强制Qt使用无显示模式
  • 单独运行单个测试定位崩溃点:xvfb-run pytest tests/testMerlot.py::TestMerlotBrowser::testBrowser -v

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 08:10:56