
本文旨在帮助开发者解决在使用 Docker Compose 部署 Flask 应用时遇到的 `kombu.exceptions.OperationalError: [Errno 111] Connection refused` 错误。该错误通常是由于 Celery 尝试在 RabbitMQ 服务完全启动之前连接到 Broker 导致的。本文将提供一种通过添加健康检查来确保 RabbitMQ 服务准备就绪的解决方案。
当你在 Docker Compose 环境中运行 Flask 应用,并且使用 Celery 作为异步任务队列,RabbitMQ 作为 Broker 时,可能会遇到 kombu.exceptions.OperationalError: [Errno 111] Connection refused 错误。这个错误表明 Celery 无法连接到 RabbitMQ 服务。
根本原因是 Docker Compose 在启动服务时,并不会等待 RabbitMQ 完全启动并准备好接受连接。Celery worker 可能会在 RabbitMQ 服务仍在启动时尝试连接,导致连接被拒绝。
为了解决这个问题,我们需要在 docker-compose.yml 文件中为 RabbitMQ 服务添加健康检查。健康检查允许 Docker Compose 确定服务是否已准备好接受连接。只有在健康检查通过后,依赖于 RabbitMQ 的服务(如 Celery worker)才会启动。
在 docker-compose.yml 文件中,找到 rabbitmq 服务的定义,并添加 healthcheck 部分:
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
healthcheck:
test: rabbitmq-diagnostics -q ping
interval: 30s
timeout: 30s
retries: 3
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
- 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
ports:
- 5000:8080
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修改 docker-compose.yml 文件后,需要重新启动 Docker Compose:
docker-compose down docker-compose up --build
docker-compose down 命令会停止并移除现有的容器,docker-compose up --build 命令会重新构建镜像并启动容器。
通过为 RabbitMQ 服务添加健康检查,可以确保 Celery worker 在 RabbitMQ 服务完全启动并准备好接受连接后再尝试连接,从而避免 kombu.exceptions.OperationalError: [Errno 111] Connection refused 错误。这种方法可以提高 Docker Compose 环境中 Flask 应用的稳定性和可靠性。
以上就是解决 Docker Compose 中 Flask 应用的 Kombu 连接错误的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号