Docker Compose部署Python/Flask应用遇database模块找不到错误排查
Flask应用Docker Compose部署时出现ModuleNotFoundError: No module named 'database'
错误日志
2024-01-23 09:19:35 Usage: flask run [OPTIONS] 2024-01-23 09:19:35 Try 'flask run --help' for help. 2024-01-23 09:19:35 2024-01-23 09:19:35 Error: While importing 'app.application.app', an ImportError was raised: 2024-01-23 09:19:35 2024-01-23 09:19:35 Traceback (most recent call last): 2024-01-23 09:19:35 File "/usr/local/lib/python3.9/site-packages/flask/cli.py", line 247, in locate_app 2024-01-23 09:19:35 __import__(module_name) 2024-01-23 09:19:35 File "/app/application/app.py", line 1, in <module> 2024-01-23 09:19:35 from database.dbscript import create_table_from_schema 2024-01-23 09:19:35 ModuleNotFoundError: No module named 'database'
相关配置与代码
Dockerfile
FROM python:3.11 WORKDIR /usr/src/app COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt COPY src/ . EXPOSE ${SERVER_PORT} ENV FLASK_APP=application/app.py ENV FLASK_ENV=development CMD ["flask", "run", "--host=0.0.0.0"]
docker-compose.yml
version: '3.8' services: mysql: container_name: mysql image: mysql:latest restart: always environment: MYSQL_DATABASE: 'mysql' MYSQL_USER: 'admin' MYSQL_PASSWORD: 'admin' MYSQL_ROOT_PASSWORD: 'admin' ports: - 3307:3306 web: container_name: webapp build: context: . dockerfile: Dockerfile ports: - "5001:5000" depends_on: - mysql
app.py
from database.dbscript import create_table_from_schema print("hello")
问题背景
本地运行正常的Python/Flask应用,通过Docker Compose部署时,webapp容器出现上述模块找不到的错误,已尝试调整Docker Compose及Dockerfile配置但问题未解决,求问为何Docker无法访问database模块。
问题原因及解决办法
核心原因
容器内Python的模块搜索路径与本地环境不一致,导致无法识别database模块:
- 本地
src目录下应该包含application和database两个同级子目录,但Dockerfile中COPY src/ .将src下的内容直接平铺到/usr/src/app,虽然目录结构看似正确,但Python的模块搜索路径没有包含当前工作目录的子目录,或者Flask启动时的模块定位逻辑出现偏差。 - 错误日志中显示Flask尝试导入
app.application.app,说明容器内的模块路径被错误解析,导致database模块不在搜索范围内。
具体修复步骤
1. 确认本地目录结构
确保src目录结构如下(必须保证application和database同级):
src/ ├── application/ │ └── app.py └── database/ └── dbscript.py
2. 修改Dockerfile,配置正确的模块路径
调整Dockerfile,通过PYTHONPATH指定模块搜索路径,并修正Flask应用的定位:
FROM python:3.11 WORKDIR /usr/src/app COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt # 保持src目录结构完整复制到容器 COPY src/ ./src/ # 设置PYTHONPATH,让Python能找到src下的所有模块 ENV PYTHONPATH=/usr/src/app/src # 修正Flask应用的路径 ENV FLASK_APP=src/application/app.py ENV FLASK_ENV=development EXPOSE 5000 CMD ["flask", "run", "--host=0.0.0.0"]
3. 补充包识别文件(可选)
如果上述步骤仍未生效,在application和database目录下添加空的__init__.py文件,让Python将这两个目录识别为合法的模块包。
4. 重新构建并启动服务
执行以下命令清理旧镜像并重新部署:
docker-compose down docker-compose build --no-cache docker-compose up
内容的提问来源于stack exchange,提问作者codefreak
相关产品推荐
相关产品推荐

