如何在 docker-compose 中将 Flower 连接到代理 RabbitMQ

问题描述

如何将 Flower 连接到 RabbitMQ。我的 celery 运行任务没有出现在 Flower 上。虽然他们运行良好。在 Flower UI 上,当我单击“broker”时,我在终端上收到此错误消息 [E 210326 10:53:07 broker:78] RabbitMQ management API call Failed: Timeout while connecting

这是我的 docker-compose 文件

version: "3.8"

services:
    base:
        container_name: base
        image: postgres:13
        ports:
            - "5433:5432"
        environment:
            - POSTGRES_USER=${POSTGRES_USER}
            - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
            - POSTGRES_DB=${POSTGRES_DB}
        volumes:
            - /var/lib/postgresql/data
    api:
        build:
            context: ./api/
            dockerfile: Dockerfile
        volumes:
            - ./api/app:/app/app
        ports:
            - "1000:80"
        depends_on:
            - base
        env_file:
            - .env
        command: ["/start-reload.sh"]

    frontend:
        build:
            context: ./frontend/
            dockerfile: Dockerfile
        ports:
            - "3000:3000"
        volumes:
            - /app/node_modules
            - ./frontend:/app
        environment:
            - NODE_ENV=development
        stdin_open: true
        links:
            - api

    rabbitmq:
        image: "bitnami/rabbitmq:latest"
        ports:
            - "4369:4369"
            - "5672:5672"
            - "25672:25672"
            - "15672:15672"
        volumes:
            # - "rabbitmq_data:/bitnami"
            - /bitnami

    redis:
        image: "bitnami/redis:latest"
        environment:
            - REdis_PASSWORD=password123
        ports:
            - "6379:6379"
        volumes:
            # - "redis_data:/bitnami/redis/data"
            - /bitnami/redis/data

    flower:
        image: mher/flower
        command: ["flower","--broker=amqp://user:bitnami@rabbitmq:5672//","--port=8888"]
        ports:
            - 8888:8888
        depends_on:
            - rabbitmq
            - redis

    worker:
        build:
            context: ./api/
            dockerfile: Dockerfile.celery
        depends_on:
            - rabbitmq
            - redis
        volumes:
            - ./api/app:/app
        command: celery -A app.worker.celery_worker worker --loglevel=INFO --concurrency=4 -Q test-queue

解决方法

我在过去三天的测试中也遇到了同样的问题。在测试期间,Flower 仅正确工作一次。我当时没能确定它为什么起作用。

对我来说,解决这个问题的唯一方法是将 docker 镜像从 mher/flower:latestmher/flower:0.9.7 降级到 mher/flower:0.9.5。更改命令行选项、环境变量和 docker-compose.yml 内容没有帮助。降级后一切正常。


笔记。我的环境是

  • 机器 - 带有 WSL2 的 Windows 10
  • 主要 - ubuntu:20.04 与 Django 3.1.7,celery[librabbitmq,redis] 5.0.5,django-celery-beat 2.2.0
  • Celery Broker - rabbitmq:management
  • Celery ResultBackend - redis:latest
  • 芹菜花 - mher/flower:latest > mher/flower:0.9.5
,

我已经在 Flower 项目中打开了一个问题,如果我有空闲时间,我会尝试解决这个问题,但同时在调查部分,您应该会看到原因。

github 中的问题:https://github.com/mher/flower/issues/1112

,

您需要添加网络才能将它们组合在同一网络中。之后,您可以使用服务名称作为主机名。喜欢rabbitmq

version: "3.8"

services:
    base:
        container_name: base
        image: postgres:13
        ports:
            - "5433:5432"
        environment:
            - POSTGRES_USER=${POSTGRES_USER}
            - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
            - POSTGRES_DB=${POSTGRES_DB}
        volumes:
            - /var/lib/postgresql/data
        networks:
            - app-network
    api:
        build:
            context: ./api/
            dockerfile: Dockerfile
        volumes:
            - ./api/app:/app/app
        ports:
            - "1000:80"
        depends_on:
            - base
        env_file:
            - .env
        command: ["/start-reload.sh"]
        networks:
            - app-network
    frontend:
        build:
            context: ./frontend/
            dockerfile: Dockerfile
        ports:
            - "3000:3000"
        volumes:
            - /app/node_modules
            - ./frontend:/app
        environment:
            - NODE_ENV=development
        stdin_open: true
        links:
            - api
        networks:
            - app-network    
    rabbitmq:
        image: "bitnami/rabbitmq:latest"
        ports:
            - "4369:4369"
            - "5672:5672"
            - "25672:25672"
            - "15672:15672"
        volumes:
            # - "rabbitmq_data:/bitnami"
            - /bitnami
        networks:
            - app-network    
    redis:
        image: "bitnami/redis:latest"
        environment:
            - REDIS_PASSWORD=password123
        ports:
            - "6379:6379"
        volumes:
            # - "redis_data:/bitnami/redis/data"
            - /bitnami/redis/data
        networks:
            - app-network    
    flower:
        image: mher/flower
        command: ["flower","--broker=amqp://user:bitnami@rabbitmq:5672//","--port=8888"]
        ports:
            - 8888:8888
        depends_on:
            - rabbitmq
            - redis
        networks:
            - app-network    
    worker:
        build:
            context: ./api/
            dockerfile: Dockerfile.celery
        depends_on:
            - rabbitmq
            - redis
        volumes:
            - ./api/app:/app
        command: celery -A app.worker.celery_worker worker --loglevel=INFO --concurrency=4 -Q test-queue
        networks:
            - app-network    
    networks:
      app-network:
        driver: bridge
,

你可以使用这个 docker-compose 文件:

version: '3.4'
services:
    rabbitmq:
        image: rabbitmq
        ports: 
          - 5672:5672


    flower:
        image: mher/flower
        environment: 
            - CELERY_BROKER_URL=pyamqp://guest@rabbitmq//
            - FLOWER_PORT=5555
        ports: 
            - 5555:5555
        depends_on: 
            - rabbitmq

*** 切记不要对 CELERY_BROKER_URL 值使用单引号!!以下配置将引发错误:

        - CELERY_BROKER_URL='pyamqp://guest@rabbitmq//'