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

Docker-Compose部署Flask+Celery应用报错:No module named 'src'

问题:Docker部署Flask+Celery应用时出现ModuleNotFoundError: No module named 'src'

尝试通过Docker部署由Flask、Python、Celery、MongoDB和RabbitMQ组成的应用,执行docker build后运行docker-compose up时触发上述错误。以下是完整配置与代码:

目录结构

项目根目录结构如下:

├── src/
│   ├── app.py
│   └── task.py
├── Dockerfile
├── docker-compose.yml
├── pyproject.toml
└── poetry.lock

现有配置文件

Dockerfile

FROM python:3.11-alpine AS builder

RUN pip install poetry

WORKDIR /backend

COPY pyproject.toml poetry.lock ./

RUN poetry config virtualenvs.create false && poetry install --no-root

FROM python:3.11-alpine

WORKDIR /backend

COPY --from=builder /usr/local/lib/python3.11/site-packages/ /usr/local/lib/python3.11/site-packages/
COPY --from=builder /usr/local/bin/ /usr/local/bin/

COPY . .

docker-compose.yml

version: '3.9'
services:
  mongodb:
    image: mongo:latest
    container_name: mongodb
    environment:
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=admin
    restart: always
    ports:
      - 27017:27017
    volumes:
      - mongodb_data:/data/db

  rabbitmq:
    image: rabbitmq:3-management
    container_name: rabbitmq
    restart: always
    environment:
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=admin
      - RABBITMQ_DEFAULT_VHOST=/
    ports:
      - 5672:5672
      - 15672:15672
    volumes:
      - rabbitmq_data:/var/lib/rabbitmq

  celery_worker:
    build: .
    container_name: celery_worker
    environment:
      - CELERY_BROKER_URL=amqp://admin:admin@rabbitmq:5672
    restart: always
    command: celery --app src.task worker --loglevel=info -O fair --queues default 
    depends_on:
      - mongodb
      - rabbitmq

  flask_app:
    build: .
    container_name: flask_app
    command: python3 src/app.py
    restart: always
    tty: true
    environment:
      - SERVER_HOST=0.0.0.0
      - SERVER_PORT=5000
      - FLASK_APP=src/app.py
    ports:
      - 5000:5000
    depends_on:
      - mongodb
      - rabbitmq
      - celery_worker
volumes:
  mongodb_data:  # Volume para persistência dos dados do MongoDB
  rabbitmq_data: # Volume para persistência dos dados do RabbitMQ

src/app.py

import os
from flask import Flask
from src.task import add

app = Flask(__name__)


@app.route('/')
def hello():
    add.delay(1, 2)
    return "Docker compose working!"


if __name__ == '__main__':
    host = os.environ.get('SERVER_HOST', 'localhost')
    port = os.environ.get('SERVER_PORT', '8001')
    print(f"Server listenning {host}:{port}")
    app.run(host=host, port=port, debug=True)

src/task.py

import os 
from celery import Celery

broker = os.environ.get('CELERY_BROKER_URL', 'amqp://guest@localhost//')
celery = Celery('myapp', include=['src.task'])

@celery.task(queue='default')
def add(x, y):
    print(f'Adding {x} + {y}')
    return x + y

pyproject.toml

[tool.poetry]
name = ""
version = "0.1.0"
description = ""
authors = ""

[tool.poetry.dependencies]
python = "^3.11"
Flask = "^3.0.0"
celery = "^5.3.6"
pymongo = "^4.6.1"

[tool.poetry.dev-dependencies]

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

修复方案

1. 将src标记为Python包

在src目录下创建空的__init__.py文件,让Python识别src为可导入的包:

touch src/__init__.py

2. 配置Python路径(PYTHONPATH)

容器内Python默认不会把/backend加入模块搜索路径,需要显式设置,二选一即可:

方式一:修改Dockerfile添加环境变量

在最终镜像的WORKDIR /backend之后添加环境变量配置:

ENV PYTHONPATH=/backend

修改后的完整Dockerfile:

FROM python:3.11-alpine AS builder

RUN pip install poetry

WORKDIR /backend

COPY pyproject.toml poetry.lock ./

RUN poetry config virtualenvs.create false && poetry install --no-root

FROM python:3.11-alpine

WORKDIR /backend

ENV PYTHONPATH=/backend

COPY --from=builder /usr/local/lib/python3.11/site-packages/ /usr/local/lib/python3.11/site-packages/
COPY --from=builder /usr/local/bin/ /usr/local/bin/

COPY . .

方式二:在docker-compose命令中临时设置PYTHONPATH

直接修改docker-compose.yml中的服务命令:

  • 修改flask_app的command:
    command: PYTHONPATH=/backend python3 src/app.py
    
  • 修改celery_worker的command:
    command: PYTHONPATH=/backend celery --app src.task worker --loglevel=info -O fair --queues default
    

3. 验证修复

重新构建镜像并启动服务:

docker-compose build --no-cache
docker-compose up

错误原因说明

  • 缺少src/__init__.py导致Python无法将src识别为合法包
  • 容器内的Python模块搜索路径不包含项目根目录/backend,因此无法找到src模块

内容的提问来源于stack exchange,提问作者Louis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:10:01