GCP通过Docker部署Flask应用报No module named 'app'错误
问题根因
触发ModuleNotFoundError: No module named 'app'的核心原因有两个:
- Gunicorn启动参数配置错误:你当前的启动命令指定加载
app:app,意味着Gunicorn会去寻找名为app的Python模块(要么是app.py文件,要么是带__init__.py的app/文件夹),再从模块中导入名为app的Flask实例,但你的项目里既没有对应路径的app模块,也没有直接暴露的app实例。 - 你使用了Flask应用工厂模式(通过
create_app()函数初始化app实例),就算模块路径正确,直接用模块名:变量名的写法也无法正确触发工厂函数生成应用实例。另外你之前注释的app:main写法也是错的——main是蓝图对象,不是Flask应用实例,不能作为Gunicorn的加载入口。
修复步骤
推荐按照标准Flask项目结构调整,步骤如下:
- 调整项目目录结构
在Dockerfile所在的项目根目录,新建名为app的文件夹,把现有__init__.py、main.py、auth.py、models.py、templates文件夹、static文件夹全部移动到这个app文件夹内,调整后的目录结构为:
项目根目录/ ├── app/ # 应用核心代码包 │ ├── __init__.py # 你写create_app工厂函数的文件 │ ├── main.py # 主路由蓝图 │ ├── auth.py # 鉴权路由蓝图 │ ├── models.py # 数据库模型 │ ├── templates/ # 模板文件 │ └── static/ # 静态资源(如果有) ├── requirements.txt # 依赖清单 └── Dockerfile # 镜像构建文件
- 修改Dockerfile的启动命令
你原来的Dockerfile里COPY和WORKDIR配置不需要改,只需要把最后一行CMD替换为以下内容,告诉Gunicorn从app包调用create_app工厂函数生成应用实例:
CMD ["gunicorn", "-b", "0.0.0.0:8080", "app:create_app()"]
- 校验依赖清单
确认requirements.txt中已经包含所有必需依赖,至少要有以下包:
Flask Flask-SQLAlchemy Flask-Login gunicorn
额外说明
- 你当前Dockerfile中先复制requirements.txt安装依赖、再复制全量代码的顺序是正确的,可以充分利用Docker构建缓存,不需要调整。
- 如果部署后遇到数据库相关问题,注意GCP运行环境中sqlite文件的持久化问题,避免容器重建后数据丢失。
内容的提问来源于stack exchange,提问作者jkbss
相关产品推荐
相关产品推荐

