【问题标题】:How to execute mulitple commands in single line linux (openshift / docker )如何在单行 linux (openshift / docker) 中执行多个命令
【发布时间】: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


【解决方案1】:

创建一个 bash 文件并在其中添加两个命令,如下所示:

python manage.py runserver &
celery -A myapp worker --loglevel=info --concurrency=8

使用“chmod +x”使其可执行

并在您的 docker 容器中运行它 bash my_file.sh

【讨论】:

  • 是的,这可以运行多个命令。但是第一个命令 cd ./app 没有影响...manage.py 和 celery 命令只能在应用程序目录中工作。那么如何 cd 到 app 目录并在那里执行其余的命令呢?
  • 您必须在 dockerfile (WORKDIR your_path) 中添加这一行,如下所示:WORKDIR /app 在 CMD 行之前
  • WORKDIR 设置为 app 之前的目录。在我的场景中无法更改。问题的 cmets 部分提到了我要求运行多个命令的原因。如果您对这种情况有任何想法或经验,请分享您的意见
【解决方案2】:

&& 连接了两个命令,意味着以下命令将在第一个命令完成后运行,具体取决于它的退出代码。

这是一个逻辑和 -- 所以,如果第一个命令返回 false,第二个命令不会运行(因为逻辑和已知评估为 false)。

试试这个:

cd /路径; ( python manage.py runserver &); ( celery -A myapp worker --loglevel=info --concurrency=8 &);

最后的 & 也将芹菜放在背景中。如果您想在前景中使用芹菜,请将其删除。如上所述,这不是“容器原生”设计——如果每个容器有一个进程,那么其余的管理就会变得更加简单明了。通常值得弄清楚所需的其余调整(例如,可以使用 emptyDir{} 在 pod 内的容器之间共享文件)并尽早简化部署。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 2015-07-15
    • 2014-01-25
    • 2014-04-22
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多