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

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模块结构不完整,按以下步骤修复:

  1. 补全Python模块结构
    在my_app目录下创建空的__init__.py文件,让Python识别my_app为合法模块:
my_app/
├── __init__.py  # 新增此文件
├── main.py
├── templates/
│   └── index.html
  1. 修正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"]
  1. 关键修改说明
  • 路径统一:原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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 03:22:24