Docker-Compose部署Flask+Celery遇kombu连接拒绝错误求助
问题描述
使用Python、Flask、Celery、MongoDB、RabbitMQ技术栈,通过docker-compose up启动应用后调用API,返回错误:
kombu.exceptions.OperationalError: [Errno 111] Connection refused
但在Docker外直接启动Flask应用一切正常。
核心原因
- Flask容器未配置
CELERY_BROKER_URL环境变量,导致Celery默认使用localhost连接RabbitMQ,而Docker容器内的localhost指向容器自身,无法访问RabbitMQ服务容器。 - Celery实例未正确传入broker配置,即使获取了环境变量也未生效。
- RabbitMQ启动需要初始化时间,
depends_on仅保证容器启动顺序,不保证服务就绪,可能导致启动初期连接失败。
解决方案
1. 为Flask容器添加Celery Broker环境变量
修改docker-compose.yml中的flask_app服务,添加CELERY_BROKER_URL环境变量,指向Docker网络内的RabbitMQ服务:
flask_app: build: . container_name: flask_app command: python src/app.py restart: always environment: - SERVER_HOST=0.0.0.0 - SERVER_PORT=8080 - CELERY_BROKER_URL=amqp://admin:admin@rabbitmq:5672/ # 新增该行 ports: - 5000:8080 depends_on: - mongodb - rabbitmq - celery_worker
2. 完善Celery实例配置
修改src/task.py,将获取到的broker地址传入Celery构造函数:
import os from celery import Celery broker = os.environ.get('CELERY_BROKER_URL', 'amqp://guest@localhost//') # 若需要存储任务结果,可添加MongoDB作为结果后端(可选) # backend = os.environ.get('CELERY_RESULT_BACKEND', 'mongodb://admin:admin@mongodb:27017/celery_results') celery = Celery('tasks', broker=broker) # 传入broker参数 @celery.task(queue='default') def add(x, y): print(f'Adding {x} + {y}') return x + y
3. 处理RabbitMQ启动延迟(可选)
RabbitMQ启动需要初始化时间,depends_on无法保证服务就绪。添加健康检查确保RabbitMQ服务可用后再启动依赖容器:
步骤3.1:给RabbitMQ服务添加健康检查
修改docker-compose.yml中的rabbitmq服务:
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 healthcheck: test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"] interval: 30s timeout: 30s retries: 3
步骤3.2:更新依赖容器的启动条件
修改celery_worker和flask_app的depends_on,等待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 depends_on: mongodb: condition: service_started rabbitmq: condition: service_healthy flask_app: build: . container_name: flask_app command: python src/app.py restart: always environment: - SERVER_HOST=0.0.0.0 - SERVER_PORT=8080 - CELERY_BROKER_URL=amqp://admin:admin@rabbitmq:5672/ ports: - 5000:8080 depends_on: mongodb: condition: service_started rabbitmq: condition: service_healthy celery_worker: condition: service_started
验证修改
执行以下命令重启服务:
docker-compose down docker-compose up --build
调用API后,检查Celery worker日志是否输出Adding 1 + 2,确认任务正常执行。
内容的提问来源于stack exchange,提问作者Louis
相关产品推荐
相关产品推荐

