【问题标题】:running celery tasks and celery beat in ECS with Django使用 Django 在 ECS 中运行 celery 任务和 celery beat
【发布时间】:2020-05-24 16:54:34
【问题描述】:

我是第一次使用 ECS。我已将我的 Django 2.2 应用程序 docker 化,并使用 ECS 和 uwsgi 在生产环境中运行 Django 应用程序。

在开发环境中,我不得不运行三个命令来运行 Django 服务器、celery 和 celery beat

python manage.py runserver
celery -A qcg worker -l info
celery beat -A qcg worker -l info

qcg 是我的应用程序。

我的 Dockerfile 有以下 uwsgi 配置

EXPOSE 8000
ENV UWSGI_WSGI_FILE=qcg/wsgi.py

ENV UWSGI_HTTP=:8000 UWSGI_MASTER=1 UWSGI_HTTP_AUTO_CHUNKED=1 UWSGI_HTTP_KEEPALIVE=1 UWSGI_LAZY_APPS=1 UWSGI_WSGI_ENV_BEHAVIOR=holy

ENV UWSGI_WORKERS=2 UWSGI_THREADS=4

ENV UWSGI_STATIC_MAP="/static/=/static_cdn/static_root/" UWSGI_STATIC_EXPIRES_URI="/static/.*\.[a-f0-9]{12,}\.(css|js|png|jpg|jpeg|gif|ico|woff|ttf|otf|svg|scss|map|txt) 315360000"

USER ${APP_USER}:${APP_USER}

ENTRYPOINT ["/app/scripts/docker/entrypoint.sh"]

entrypoint.sh 文件有

exec "$@"

我已经创建了 ECS 任务定义,并且在容器的命令输入中,我有

uwsgi --show-config

这将启动uwsgi 服务器。

现在我在集群中运行 1 个 EC2 实例,并运行一个带有两个任务定义实例的服务。

我不知道如何在我的应用程序中运行 celery 任务和 celery beat。

我需要为运行 celery 和 celery-beat 创建单独的任务吗?

【问题讨论】:

    标签: django docker amazon-ecs ecs-taskdefinition


    【解决方案1】:

    是的,您需要为 celery beat 和 celery worker 运行单独的 ECS 任务(或单独的 ECS 服务)。 Celery Beat 会将 Celery 任务发送给 Celery worker。

    我为 Celery、Celery beat 和 Django 使用单独的 Dockerfile。

    Worker Dockerfile 类似这样:

    FROM python:3.8
    
    ENV PYTHONUNBUFFERED 1
    ADD requirements.txt /requirements.txt
    
    RUN pip install -r /requirements.txt
    ADD . /src
    WORKDIR /src
    
    CMD ["celery", "-A", "<appname>", "worker"]
    

    并击败 Dockerfile:

    FROM python:3.8
    
    ENV PYTHONUNBUFFERED 1
    ADD requirements.txt /requirements.txt
    
    RUN pip install -r /requirements.txt
    ADD . /src
    WORKDIR /src
    
    CMD ["celery", "-A", "<appname>", "beat"]
    

    【讨论】:

      最近更新 更多