Flask应用运行docker-compose时报canopen模块ModuleNotFoundError问题
问题排查与修复方案
核心问题原因
- Dockerfile依赖安装逻辑错误:没有安装requirements.txt中声明的全量依赖,安装顺序完全不符合最佳实践,多余的
pip3 freeze >> requirements.txt还会污染本地的依赖声明 - docker-compose的bind mount配置覆盖了容器内的工作目录:如果本地环境未安装canopen,或者本地存在虚拟环境目录被挂载进容器,会导致镜像中安装的依赖包失效
具体修复步骤
1. 重写Dockerfile
正确的构建逻辑应该优先复制依赖声明文件安装依赖,利用Docker层缓存避免每次代码变更都重新安装依赖,移除冗余错误逻辑:
FROM python:3.9.1 # 提前安装后续需要的系统依赖(解决容器内无sudo、ifconfig等命令的问题) RUN apt update && apt install -y --no-install-recommends sudo net-tools iproute2 \ && rm -rf /var/lib/apt/lists/* WORKDIR /docker_endurance # 先复制依赖声明,安装全量Python依赖 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 最后复制业务代码 COPY . .
2. 新增.dockerignore文件
在项目根目录创建.dockerignore,避免本地虚拟环境、缓存文件被复制进镜像:
venv/ __pycache__/ *.pyc .git/ .DS_Store
3. 调整docker-compose.yml
先注释掉volumes挂载配置,验证镜像本身的依赖安装是否正常:
version: "3.7" services: app: build: . command: python main.py ports: - "5000:5000" privileged: true # 后续操作CAN设备需要特权权限 # 调试通过后如果需要本地代码热更新再放开以下配置,需确保本地也安装了全量依赖 # volumes: # - .:/docker_endurance
验证方法
执行以下命令重新构建启动服务即可:
sudo docker-compose down -v sudo docker-compose up --build
内容的提问来源于stack exchange,提问作者user17052148
相关产品推荐
相关产品推荐

