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
相关产品推荐
相关产品推荐

