Docker容器内执行pytest报错找不到fastapi模块该如何解决?
问题解决方法
问题根因
- 容器内置换了pytest执行路径:你在安装tesseract-ocr时,apt包管理器可能顺带安装了系统级的
python3-pytest包,这个pytest绑定的是系统自带的Python解释器,而你的fastapi、pytest等依赖是通过pip安装到官方Python镜像自带的Python3.9环境中,两者的依赖库路径不互通,直接执行pytest命令时默认调用了系统版本的pytest,就会找不到pip安装的依赖。 - 特殊现象的合理性:uvicorn是通过pip安装的,启动时会调用对应pip所在的Python3.9解释器,能正确读取所有依赖,所以ASGI服务运行正常;本地conda环境的pytest和fastapi属于同一个环境,所以执行不会报错。
解决步骤
第一步:验证根因
执行以下命令进入容器:docker exec -it <container_name> bash
分别执行命令确认:
- 确认Python环境有fastapi依赖:
python -c "import fastapi; print(fastapi.__version__)",如果正常输出版本号说明依赖安装正常 - 确认pytest调用路径:
which pytest,如果输出为/usr/bin/pytest,则说明调用的是apt安装的系统版本pytest,符合根因判断
第二步:选择对应解决方法
- 方法1(最稳妥,无需修改镜像):执行测试时改用Python解释器调用pytest
直接在外部执行命令:docker exec <container_name> python -m pytest api/tests/test_endpoints.py
该命令会调用安装依赖的Python3.9解释器自带的pytest,可正常读取所有依赖。 - 方法2(修改Dockerfile一劳永逸):在Dockerfile的apt安装步骤后添加卸载系统pytest的逻辑,修改后Dockerfile对应部分如下:
重新构建镜像后,直接执行RUN apt update RUN apt-get -y install tesseract-ocr # 卸载apt安装的系统版本pytest,避免和pip安装的版本冲突 RUN apt-get remove -y python3-pytest RUN pip install --upgrade pip RUN pip install --upgrade -r /app/api/requirements.txtdocker exec <container_name> pytest api/tests/test_endpoints.py即可正常运行。 - 方法3(临时适配路径问题):如果是Python模块搜索路径缺失导致的问题,可在执行测试时添加PYTHONPATH环境变量:
docker exec <container_name> PYTHONPATH=/app pytest api/tests/test_endpoints.py
内容的提问来源于stack exchange,提问作者Sandip Saha Joy
相关产品推荐
相关产品推荐

