Docker容器运行报错ModuleNotFoundError:缺失ultralytics模块
问题排查:Docker容器运行时提示ModuleNotFoundError: No module named 'ultralytics'
问题描述
构建包含机器学习模型API的Docker镜像成功,但运行容器后立即停止,日志报错ModuleNotFoundError: No module named 'ultralytics',相关报错信息:
Downloading: "https://github.com/ultralytics/yolov5/zipball/master" to /root/.cache/torch/hub/master.zip Traceback (most recent call last): File "/usr/local/bin/uvicorn", line 8, in <module> sys.exit(main()) ... ModuleNotFoundError: No module named 'ultralytics'.
当前Dockerfile内容:
FROM python:3.8 as python WORKDIR my-container RUN python3 -m venv venv ENV PYTHONPATH my-container/venv/bin COPY requirements.txt requirements.txt RUN . ./venv/bin/activate && pip install --upgrade pip && pip install -r requirements.txt FROM my-detector:1.0.0 EXPOSE 80
requirements.txt已包含ultralytics==8.0.100等依赖。
问题原因
- 多阶段构建逻辑错误:第二个阶段
FROM my-detector:1.0.0完全未继承第一个阶段的依赖和虚拟环境,相当于使用了一个全新镜像,和第一阶段的构建内容无关联,自然找不到安装的ultralytics包。 - PYTHONPATH设置错误:
PYTHONPATH应指向Python的site-packages目录,而非虚拟环境的bin目录——bin目录仅存放可执行文件,不是模块路径。 - 运行时未使用虚拟环境的Python解释器:即使虚拟环境配置正确,若直接调用系统的python/uvicorn,也无法加载虚拟环境内的依赖。
修复方案
修改Dockerfile,移除无效多阶段构建,确保依赖安装正确,且运行时使用虚拟环境的解释器:
FROM python:3.8 WORKDIR /my-container # 创建并激活虚拟环境,安装依赖 RUN python3 -m venv venv COPY requirements.txt requirements.txt RUN . ./venv/bin/activate && pip install --upgrade pip && pip install -r requirements.txt # 复制API代码到容器(请根据实际主文件路径修改) COPY main.py . # 设置PATH,让系统优先使用虚拟环境内的可执行文件 ENV PATH="/my-container/venv/bin:$PATH" EXPOSE 80 # 使用虚拟环境的uvicorn启动API CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]
关键修复点说明
- 移除无效多阶段构建,直接基于
python:3.8构建完整镜像。 - 用
PATH环境变量替代错误的PYTHONPATH设置,确保优先调用虚拟环境内的python、pip、uvicorn。 - 明确指定使用虚拟环境的uvicorn启动API,保证加载虚拟环境中的依赖包。
- 添加API代码复制步骤(需根据实际路径调整),避免因无运行逻辑导致容器立即停止。
内容的提问来源于stack exchange,提问作者arlaine
相关产品推荐
相关产品推荐

