芹菜花与不同 Docker 容器中的多个 Worker

问题描述 投票:0回答:2

我一直在 StackOverflow 和 Google 上徘徊,但我似乎无法接近答案。

tl;dr 如何在 dockerized Flower 仪表板中注册 dockerized Celery 工作人员?如何将工作人员指向 Flower 仪表板,以便仪表板“知道”它?

我有 2 个 FastAPI 应用程序,均使用

docker-compose.yml
文件部署。第一个应用程序的
compose
文件如下所示:

version: '3.8'

services:
  web:
    build:
      context: .
      dockerfile: ./compose/local/fastapi/Dockerfile
    image: app_web
    # '/start' is the shell script used to run the service
    command: /start
    volumes:
      - .:/app
    ports:
      - 8010:8000
    env_file:
      - .env/.dev-sample
    depends_on:
      - redis

  redis:
    image: redis:6-alpine

  celery_worker:
    build:
      context: .
      dockerfile: ./compose/local/fastapi/Dockerfile
    image: app_celery_worker
    command: /start-celeryworker
    volumes:
      - .:/app
    env_file:
      - .env/.dev-sample
    depends_on:
      - redis

  flower:
    build:
      context: .
      dockerfile: ./compose/local/fastapi/Dockerfile
    image: app_celery_flower
    command: /start-flower
    volumes:
      - .:/app
    env_file:
      - .env/.dev-sample
    ports:
      - 5557:5555
    depends_on:
      - redis

所以这个应用程序负责创建 Celery Flower 仪表板。

第二个应用程序的

compose
文件如下所示:

version: '3.8'

services:
  web:
    build:
      context: .
      dockerfile: ./compose/local/fastapi/Dockerfile
    image: app_two_web
    # '/start' is the shell script used to run the service
    command: /start
    volumes:
      - .:/app
    ports:
      - 8011:8000
    env_file:
      - .env/.dev-sample
    depends_on:
      - redis

  redis:
    image: redis:6-alpine

  celery_worker:
    build:
      context: .
      dockerfile: ./compose/local/fastapi/Dockerfile
    image: app_two_celery_worker
    command: /start-celeryworker
    volumes:
      - .:/app
    env_file:
      - .env/.dev-sample
    depends_on:
      - redis

我无法让第二个应用程序的工作人员在端口 5557 上运行的 Celery Flower 仪表板中注册。一切正常,如果在不同的端口上,我什至可以使用第二个应用程序启动第二个 Flower 仪表板,但我不能似乎将第二个工作人员连接到第一个应用程序的 Flower 仪表板。

这就是两个应用程序的

main.py
的样子。

from project import create_app

app = create_app()
celery = app.celery_app


def celery_worker():
    from watchgod import run_process
    import subprocess

    def run_worker():
        subprocess.call(
            ["celery", "-A", "main.celery", "worker", "-l", "info"]
        )

    run_process("./project", run_worker)


if __name__ == "__main__":
    celery_worker()

感谢您对此提出的任何想法。

python celery fastapi
2个回答
0
投票
  • 首先通过将“-E”放入工作容器“命令:”来启用事件监控
  • 其次,在 docker-compose 配置中的每个工作服务中指定环境变量 C_FORCE_ROOT。

0
投票

我在使用 Docker compose 时遇到了同样的问题,并且添加“-E”标志效果很好。请注意,在我的例子中,我在 Docker compose 文件中定义了一个网络,所有服务都加入到该网络中。 (可以在多个 Docker compose 文件中声明同一网络,然后只需创建一次,所有服务都将从所有 Docker compose 文件连接到该网络。)

我们的 AWS ECS 集群上也存在该问题,“-E”标志也解决了该问题。

Flower 也有一个等效的 enable_events 标志。

© www.soinside.com 2019 - 2024. All rights reserved.