Docker部署Flask遇ModuleNotFoundError: No module named 'wsgi'问题
你的核心问题是Gunicorn在Docker容器中无法找到wsgi模块,导致Flask服务启动失败,进而引发Nginx 502错误。结合你的配置和操作记录,问题根源在于容器内文件路径不匹配和Gunicorn启动命令格式错误,下面是分步排查和解决方法:
一、错误原因拆解
容器内文件路径认知错误
你的docker-compose.yml中flask服务的build.context设置为app,这意味着Docker构建时会把主机上project_root/app目录下的所有文件,复制到容器的/var/www/目录(对应Dockerfile里的WORKDIR /var/www/和ADD . /var/www/)。也就是说,容器内的wsgi.py实际路径是/var/www/wsgi.py,而非你尝试的主机路径/home/project_root/app/wsgi.py,也不是错误的容器路径/var/www/app/wsgi.py。Gunicorn启动命令格式问题
Gunicorn启动Flask应用的标准格式是[模块名]:[Flask应用实例],而不是直接传入文件路径。你之前尝试的wsgi:app是正确格式,但报错可能是因为文件复制不完整或Python模块导入问题。
二、分步解决方案
步骤1:验证容器内文件结构
先确认容器内是否正确复制了wsgi.py和相关文件:
docker-compose run --rm flask ls -l /var/www/
执行后你应该能看到wsgi.py、requirements.txt以及你的Flask应用文件/文件夹。如果看不到wsgi.py,检查是否存在.dockerignore文件排除了它,或者ADD . /var/www/命令是否正确执行。
步骤2:修正Dockerfile中的启动命令
确保Dockerfile的CMD使用正确的模块格式,保持其他命令不变:
FROM python:3.6.8-alpine3.9 WORKDIR /var/www/ ADD . /var/www/ RUN apk add --no-cache build-base libffi-dev openssl-dev ncurses-dev RUN python -m pip install --upgrade pip RUN pip install -r requirements.txt EXPOSE 5000 # 正确的启动命令:模块名wsgi,应用实例app CMD [ "gunicorn", "-w", "4", "--bind", "0.0.0.0:5000", "wsgi:app"]
步骤3:确保Flask应用模块可被导入
你的wsgi.py中有from app import create_app,这要求容器内/var/www/目录下必须存在一个名为app的Python模块:
- 即存在
/var/www/app/__init__.py文件,且该文件中定义了create_app函数; - 如果你的Flask应用入口是
app.py而非app文件夹,需要修改导入语句为from app import app(假设app.py中定义了app = Flask(__name__)),并保持Gunicorn命令为wsgi:app(因为wsgi.py中最终导出的实例是app)。
步骤4:重新构建并启动服务
清理旧容器并重新构建,避免缓存干扰:
docker-compose down --volumes docker-compose build --no-cache docker-compose up -d
查看Flask服务日志确认启动状态:
docker-compose logs flask
三、额外排查点
- 检查
requirements.txt是否正确包含gunicorn和所有Flask依赖包; - 确认容器内Python版本(3.6)与本地开发环境一致,避免版本兼容性问题;
- 查看
wsgi.py中是否有其他导入错误,比如from app import create_app中的app模块是否存在。
内容的提问来源于stack exchange,提问作者ken

