代码之家  ›  专栏  ›  技术社区  ›  hugo

在同一容器中运行芹菜工人+敲打

  •  18
  • hugo  · 技术社区  · 6 年前

    我的烧瓶应用程序由四个容器组成:web应用程序、postgres、rabbitMQ和芹菜。因为我有周期性运行的芹菜任务,所以我使用芹菜节拍。我已将docker compose文件配置为:

    version: '2'
    services:
      rabbit:
        # ...      
      web:
        # ...
      rabbit:
        # ...
      celery:
        build:
            context: .
            dockerfile: Dockerfile.celery
    

    还有我的Dockerfile。芹菜看起来像这样:

    # ...code up here...
    CMD ["celery", "-A", "app.tasks.celery", "worker", "-B", "-l", "INFO"]
    

    当我在文件中读到我不应该带着 -B 选项,我还是匆匆添加了它(忘记了更改),很快就知道我的计划任务正在运行多次。对于那些感兴趣的人,如果你 ps aux | grep celery 在芹菜容器中,您将看到多个芹菜+beat进程正在运行(但应该只有一个beat进程,并且无论工作进程有多个)。从医生那里我不确定你为什么不应该跑 -B类 但现在我知道了。

    于是我改变了我的Dockerfile。芹菜至:

    # ...code up here...
    CMD ["celery", "-A", "app.tasks.celery", "worker", "-l", "INFO"]
    CMD ["celery", "-A", "app.tasks.celery", "beat", "-l", "INFO"]
    

    否当我启动应用程序时,工作进程会启动,但beat不会。当我翻转这些命令时,首先调用beat,然后启动beat,但工作进程不这样做。所以我的问题是:如何在容器中运行芹菜工人+殴打?我已经仔细阅读了许多文章/文档,但我仍然无法理解这一点。

    已编辑

    我更改了Dockerfile。芹菜如下:

    ENTRYPOINT [ "/bin/sh" ]
    CMD [ "./docker.celery.sh" ]    
    

    还有我的码头工人。芹菜。sh文件如下所示:

    #!/bin/sh -ex
    celery -A app.tasks.celery beat -l debug &
    celery -A app.tasks.celery worker -l info &
    

    但是,我收到了错误 celery_1 exited with code 0

    编辑#2

    我在docker的末尾添加了以下阻塞命令。芹菜。sh文件和所有已修复:

    tail -f /dev/null
    
    4 回复  |  直到 6 年前
        1
  •  11
  •   shahaf    6 年前

    docker只运行一个CMD,因此只执行第一个CMD,解决方法是创建一个bash脚本,同时执行worker和beat,并使用docker CMD执行此脚本

        2
  •  1
  •   Glauber Vila Verde    5 年前

    如上所述,我通过输入入口点来获得,此外,我还添加了&&燃气轮机;将输出保存在日志文件中。

    我的入口点。上海

    #!/bin/bash
    python3 manage.py migrate
    
    python3 manage.py migrate catalog --database=catalog
    
    python manage.py collectstatic --clear --noinput --verbosity 0
    
    
    # Start Celery Workers
    celery worker --workdir /app --app dri -l info &> /log/celery.log  &
    
    # Start Celery Beat
    celery worker --workdir /app --app dri -l info --beat &> /log/celery_beat.log  &
    
    python3 manage.py runserver 0.0.0.0:8000
    
    
        3
  •  0
  •   baldr    6 年前

    您可以使用 celery beatX 为了节拍。允许(并且建议)有多个beatX实例。它们使用锁进行同步。

    不能说它是否已经准备好生产,但它对我来说就像一个符咒(带 -B 键)

        4
  •  0
  •   manuele    2 年前

    从相同的概念开始@shahaf has highlighted 我从 this 其他解决方案使用 bash -c 以这种方式:

    command: bash -c "celery -A app.tasks.celery beat & celery -A app.tasks.celery worker --loglevel=debug"