首页 > 解决方案 > docker上的Celery + FastAPI,应用程序容器不与Celery同步,因此我无法使用它

问题描述

所以我正在使用 FastAPI 构建一个 webapp。我使用 Celery 来运行一些后台任务。我的代码在我的本地开发机器上运行良好,但是当我尝试对其进行 docker 化时,似乎运行在容器上的 FastAPI 应用程序无法与 celery 同步。例如我有 4 个容器:

在此处输入图像描述

如果我在我的计算机上本地启动 webapp,并且不启动 padel-checker-web-1 容器而只使用其他 3 个容器,则 d​​ocker 上的 celery 会与它同步并工作。

我的问题是让 webapp 在 docker 内运行并使用 celery,它们只是不同步。

我正在粘贴我的 docker-compose.yml 以查看是否有人可以为我指明正确的方向:

version: '3.9'

services:
  web: &app
    build: ./
    command: pipenv run python -m app.main
    networks:
      - backend-tier
    ports:
      - "8000:8000"
    depends_on:
      - worker
  rabbitmq:
    image: rabbitmq:3.9-management
    environment:
      - RABBITMQ_DEFAULT_USER=andre
      - RABBITMQ_DEFAULT_PASS=secret
    networks:
      - backend-tier
    volumes:
      - ./config/rabbitmq/rabbit.conf:/etc/rabbit/rabbit.conf
    ports:
      # The rabbitMQ management plugin - running on http://localhost:15672
      - "15672:15672"
      - "5672:5672"
  worker:
    <<: *app
    environment:
      CELERY_BROKER_URL: "amqp://andre:secret@rabbitmq/"
    ports: []
    command: ['pipenv', 'run', 'celery', '-A', 'app.feed.celery_worker.celery', 'worker', '-l', 'INFO']
    depends_on:
      - rabbitmq
    networks:
      - backend-tier
  flower:
    <<: *app
    environment:
      CELERY_BROKER_URL: "amqp://andre:secret@rabbitmq/"
    networks:
      - backend-tier
    ports:
      - "5555:5555"
    depends_on:
      - rabbitmq
      - worker
    command: ['pipenv', 'run', 'celery', 'flower']

networks:
  backend-tier:
    driver: bridge

如果我尝试使用容器,调用任何 task.delay() 它就会挂起。

在此处输入图像描述

标签: dockerceleryfastapi

解决方案


我已经修复了我的 docker-compose.yml,我猜是depends_on:

version: '3.9'

services:
  web: &app
    build: ./
    command: pipenv run python -m app.main # && pipenv run celery -A app.feed.celery_worker.celery worker -l INFO
    environment:
      - CELERY_BROKER_URL=amqp://andre:secret@rabbitmq/
    ports:
      - "8000:8000"
    depends_on:
      - rabbitmq
  rabbitmq:
    image: rabbitmq:3.9-management
    environment:
      - RABBITMQ_DEFAULT_USER=andre
      - RABBITMQ_DEFAULT_PASS=secret
    volumes:
      - ./config/rabbitmq/rabbit.conf:/etc/rabbit/rabbit.conf
    ports:
      # The rabbitMQ management plugin - running on http://localhost:15672
      - "15672:15672"
      - "5672:5672"
  worker:
    <<: *app
    environment:
      - CELERY_BROKER_URL=amqp://andre:secret@rabbitmq/
      - C_FORCE_ROOT=1
    ports: []
    command: ['pipenv', 'run', 'celery', '-A', 'app.feed.celery_worker.celery', 'worker', '-l', 'INFO']
    depends_on:
      - rabbitmq
      - web
  flower:
    <<: *app
    environment:
      CELERY_BROKER_URL: "amqp://andre:secret@rabbitmq/"
    ports:
      - "5555:5555"
    depends_on:
      - rabbitmq
      - worker
    command: ['pipenv', 'run', 'celery', 'flower']

推荐阅读