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
相关产品推荐
相关产品推荐

