我试图在Docker中使用Flask和Celery,并且遇到了Flask应用程序上下文的问题 .

Flask == 1.0.2 celery == 4.2.0 Flask-CeleryExt == 0.3.1

这是一些相关的代码 .

docker-compose.yaml

version: '3'

services:
  myapp:
    build:
      context: .
      dockerfile: compose/dev/myapp/Dockerfile
    ports:
      - '5000:5000'
      - '8888:8888'
    env_file: .env
    environment:
      - FLASK_ENV=development
    volumes:
      - .:/myapp
    entrypoint: /wait-for-postgres.sh
    command: flask run --host=0.0.0.0
    depends_on:
      - postgres
      - redis
    networks:
      - flask-redis-celery

  celery:
    build:
      context: .
      dockerfile: compose/dev/celery/Dockerfile
    command: 'celery -A myapp.tasks worker -Q default --loglevel=info'
    env_file: .env
    volumes:
      - .:/myapp
    depends_on:
      - redis
      - myapp
    networks:
      - flask-redis-celery

extensions.py

from flask_celeryext import FlaskCeleryExt
ext = FlaskCeleryExt()

app.pyregister_extensions 函数中 . 我在我的应用程序中使用应用程序工厂模式 .

ext.init_app(app)

myapp 容器内部,我可以根据documentation找到 ext.celery 并看到我有一个Celery实例并正确发送任务到

<Celery default at 0x7f600d0e7f98>

但是,尝试在我的 tasks 文件中的芹菜容器中执行相同操作会导致 ext.celery 为None .

tasks.py

from coupon.extensions import ext
celery = ext.celery # This is None

@celery.task(name='tasks.my_task', max_retries=2, default_retry_delay=60)
def my_task(some_args):
    # etc.

错误

AttributeError: 'NoneType' object has no attribute 'task'

我已经尝试了很多其他选项,包括 make_celery 中所述的 make_celery ,但是无法在芹菜容器中找到Flask和我的模型,所以不要相信这对Flask-CeleryExt非常具体 .

如果他们不访问Flask对象,我可以使Celery任务正常工作,但我需要从我的Celery任务访问SQLAlchemy模型和自定义类 .

如何让Celery在我的芹菜容器中正常工作并能够访问Flask物品?