Docker部署Flask应用报错:找不到'my_app'模块
问题描述
我正在创建一个用于演示Cloudbuild和Docker的Flask应用,文件结构如下:
项目根目录 ├── my_app/ │ ├── main.py │ ├── templates/ │ │ └── index.html │ └── (其他相关文件夹) ├── Dockerfile └── requirements.txt
构建并运行Docker镜像时,持续出现错误:ModuleNotFoundError: No module named 'my_app'。
main.py 代码
from flask import Flask, render_template, redirect, url_for from faker import Faker import random app = Flask(__name__) fake = Faker() # 生成模拟员工数据的函数 def create_employee(): return { "id": random.randint(1000, 9999), "name": fake.name(), "address": fake.address(), "email": fake.email(), "job_title": fake.job() } # 内存中的员工列表 employees = [create_employee() for _ in range(10)] # 显示员工列表的路由 @app.route('/') def index(): return render_template('index.html', employees=employees) # 添加新员工并跳转回列表的路由 @app.route('/add-employee', methods=['GET']) def add_employee(): employees.append(create_employee()) return redirect(url_for('index')) if __name__ == '__main__': app.run(host='0.0.0.0', port=8080)
Dockerfile 代码
# 使用官方Python运行时作为基础镜像 FROM python:3.8-slim # 设置环境变量 ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 # 设置容器内的工作目录为 /app WORKDIR /my_app/ # 将当前目录下的my_app内容复制到容器的/app目录 COPY ./my_app /app # 安装requirements.txt中指定的依赖包 COPY requirements.txt requirements.txt RUN pip install --no-cache-dir -r requirements.txt # 对外暴露8080端口 EXPOSE 8080 # 定义环境变量 ENV NAME World # 容器启动时运行的命令 CMD ["gunicorn", "--bind", "0.0.0.0:8080", "--workers", "1", "--threads", "8", "my_app.main:main"]
补充背景:原本main.py文件位于根目录,因测试时遇到模块查找问题,我将其及其他文件夹移入了'my_app'目录。
解决方案
出现ModuleNotFoundError的核心原因是Dockerfile路径配置错误、Python模块结构不完整,按以下步骤修复:
- 补全Python模块结构
在my_app目录下创建空的__init__.py文件,让Python识别my_app为合法模块:
my_app/ ├── __init__.py # 新增此文件 ├── main.py ├── templates/ │ └── index.html
- 修正Dockerfile路径与启动命令
修改后的Dockerfile如下:
FROM python:3.8-slim ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 # 统一工作目录为/app WORKDIR /app # 将本地my_app完整复制到容器的/app/my_app路径下 COPY ./my_app /app/my_app # 复制依赖文件到容器工作目录 COPY requirements.txt /app/requirements.txt RUN pip install --no-cache-dir -r requirements.txt EXPOSE 8080 ENV NAME World # 修正gunicorn命令:Flask实例变量为app,而非main CMD ["gunicorn", "--bind", "0.0.0.0:8080", "--workers", "1", "--threads", "8", "my_app.main:app"]
- 关键修改说明
- 路径统一:原Dockerfile工作目录与复制路径混乱,改为以
/app为核心工作目录,确保my_app模块处于Python可搜索的路径下。 - 启动命令修正:你的Flask实例变量是
app(app = Flask(__name__)),原命令写的my_app.main:main是错误的,需改为my_app.main:app。 - 模块标识:
__init__.py是Python包的必要标识,缺少它Python无法将my_app识别为可导入的模块。
内容的提问来源于stack exchange,提问作者Patrick Bentley
相关产品推荐
相关产品推荐

