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

Docker-Compose部署Flask+Celery遇kombu连接拒绝错误求助

问题描述

使用Python、Flask、Celery、MongoDB、RabbitMQ技术栈,通过docker-compose up启动应用后调用API,返回错误:

kombu.exceptions.OperationalError: [Errno 111] Connection refused

但在Docker外直接启动Flask应用一切正常。

核心原因

  1. Flask容器未配置CELERY_BROKER_URL环境变量,导致Celery默认使用localhost连接RabbitMQ,而Docker容器内的localhost指向容器自身,无法访问RabbitMQ服务容器。
  2. Celery实例未正确传入broker配置,即使获取了环境变量也未生效。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:22:54