You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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模块:

  1. 本地src目录下应该包含application和database两个同级子目录,但Dockerfile中COPY src/ .将src下的内容直接平铺到/usr/src/app,虽然目录结构看似正确,但Python的模块搜索路径没有包含当前工作目录的子目录,或者Flask启动时的模块定位逻辑出现偏差。
  2. 错误日志中显示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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 12:50:23