我一直在 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()
感谢您对此提出的任何想法。
我在使用 Docker compose 时遇到了同样的问题,并且添加“-E”标志效果很好。请注意,在我的例子中,我在 Docker compose 文件中定义了一个网络,所有服务都加入到该网络中。 (可以在多个 Docker compose 文件中声明同一网络,然后只需创建一次,所有服务都将从所有 Docker compose 文件连接到该网络。)
我们的 AWS ECS 集群上也存在该问题,“-E”标志也解决了该问题。
Flower 也有一个等效的 enable_events 标志。