Docker Compose运行应用时出现Flask模块缺失错误求助
问题分析与解决方案
问题描述
通过Docker Compose部署Flask应用时,容器启动后抛出如下错误:
web-1 | Traceback (most recent call last): web-1 | File "/app/app.py", line 1, in <module> web-1 | from flask import Flask, request, render_template, redirect, url_for web-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ web-1 | ModuleNotFoundError: No module named 'flask' web-1 exited with code 1
核心原因
- requirements.txt格式异常:文件中
pymongo前存在多余缩进,pip解析依赖清单时可能出现识别错误,导致Flask依赖未被正确安装。 - 目录挂载覆盖依赖:docker-compose.yml中配置了
volumes: - .:/app,将本地当前目录直接挂载到容器内的/app目录,覆盖了容器构建阶段已安装好的依赖包(容器内的Python依赖目录被本地无依赖的目录替换)。
解决方案
方案1:修复依赖文件+精准挂载代码
修正requirements.txt格式:
移除pymongo前的多余空格,同时确保版本号与包名间无空格,修改后内容如下:pymongo Flask==2.2.2调整docker-compose的volume配置:
仅挂载需要热更新的代码文件,而非整个目录,避免覆盖容器内的依赖环境:version: '3' services: web: build: . command: python -u app.py ports: - "5000:5000" volumes: - ./app.py:/app/app.py # 若有templates/static目录,可单独挂载 # - ./templates:/app/templates links: - db db: image: mongo:latest hostname: test_mongodb environment: - MONGO_INITDB_DATABASE=Student_db - MONGO_INITDB_ROOT_USERNAME=root - MONGO_INITDB_ROOT_PASSWORD=pass ports: - 27017:27017
方案2:保留全目录挂载,启动前重新安装依赖
如果必须挂载整个本地目录,可修改启动命令,在运行应用前强制重新安装依赖:
version: '3' services: web: build: . command: bash -c "pip install -r requirements.txt && python -u app.py" ports: - "5000:5000" volumes: - .:/app links: - db db: image: mongo:latest hostname: test_mongodb environment: - MONGO_INITDB_DATABASE=Student_db - MONGO_INITDB_ROOT_USERNAME=root - MONGO_INITDB_ROOT_PASSWORD=pass ports: - 27017:27017
方案3:禁用本地目录挂载(生产环境推荐)
如果不需要本地代码热更新,直接删除docker-compose.yml中的volumes配置,容器将使用构建阶段已安装好的依赖环境:
version: '3' services: web: build: . command: python -u app.py ports: - "5000:5000" links: - db db: image: mongo:latest hostname: test_mongodb environment: - MONGO_INITDB_DATABASE=Student_db - MONGO_INITDB_ROOT_USERNAME=root - MONGO_INITDB_ROOT_PASSWORD=pass ports: - 27017:27017
验证步骤
- 执行
docker-compose down清理旧容器与镜像 - 执行
docker-compose build --no-cache重新构建镜像 - 执行
docker-compose up启动服务,检查错误是否消除
内容的提问来源于stack exchange,提问作者Muhammad Qasim
相关产品推荐
相关产品推荐

