【发布时间】:2021-12-01 08:18:02
【问题描述】:
我正在寻找一种在单行中运行 django 服务器和 celery 的方法。服务(django 和 celery)在 openshift 中部署为两个具有相同映像的独立 pod,目前我正在使用 python manage.py runserver 运行 django 服务(pod)和使用 celery -A myapp worker --loglevel=info --concurrency=8 运行 celery(pod)
我不想为每个 pod 运行单独的 pod,而是想一起执行 runserver 命令和 celery worker 命令。如何做到这一点。
我知道 && ; || 用于此类场景。但那些不起作用。
例如:
cd ./app && python manage.py runserver #this works
cd ./app && python manage.py runserver && celery -A myapp worker --loglevel=info --concurrency=8
#this will cd to app, execute runserver command. but celery command doesn't get executed.
【问题讨论】:
-
为此运行两个单独的部署(覆盖 Celery worker 中的
command:)是标准模式。尝试在一个容器中运行两个进程存在一些巨大的隐藏复杂性,包括找出如果只有一个组件发生故障时要重新启动的内容。单独部署还可以让您分别扩展这两个组件,因此如果适合您的负载模式,您可以让 3 个应用程序容器为 20 个后台工作人员提供服务。 -
是的,没错。但我想一起运行它们,因为当 celery 执行时,它会创建一些媒体文件,并且 nginx 媒体路由无法访问这些文件。如果我可以同时运行 django 和 celery,文件将在具有 nginx 反向代理的位置创建
-
@DavidMaze 还有其他方法可以做我在上面评论中提到的吗?由于 celery 不公开服务,我无法将媒体指向 celery pod
-
你需要在守护进程模式下运行django的服务器。由于您首先启动 django 服务器,因此它不会执行下一个任务,即 Celery。看看这个答案。 stackoverflow.com/a/14438536/9223271
-
@Mehak 下面由 sbabti 回答的答案是允许一起运行多个命令。但是,不建议在上面的 cmets 中提到 David 在单个 pod 中运行 django 和 celery。所以我想知道是否有任何方法可以将 nginx 指向 celery pod 以进行 /media 请求?由于运行 celery 不会公开服务,因此我无法使用代理通行证以正常方式进行操作
标签: django linux docker celery openshift