我正在尝试修改django项目,以便使用我使用的shell中的gunicorn运行该项目:
gunicorn --bind :8000 --workers $(( 2 * `cat /proc/cpuinfo | grep 'core id' | wc -l` + 1 )) MyQ.wsgi:application它的工作原理很好,它的想法是利用尽可能多的核心,就像我在文中定义的那样。
$(2* cat /proc/cpuinfo | grep 'core id' | wc -l +1)部分只返回2*n+1,其中n是系统中的核心数量。
但是,我在将这个命令重写为Dockerfile时遇到了一些困难,下面是我当前的尝试:
CMD ["gunicorn", "--bind :8000", "--workers", "$(( 2 * `cat /proc/cpuinfo | grep 'core id' | wc -l` + 1 ))", "MyQ.wsgi:application"]当我运行docker运行时,这会导致以下错误崩溃:
gunicorn: error: argument -w/--workers: invalid int value: "$(( 2 * `cat /proc/cpuinfo | grep 'core id' | wc -l` + 1 ))"所以基本上“$.”没有被评估,我也不知道怎么解决。
发布于 2018-07-27 15:46:01
我认为最好在ENV指令中定义一个Dockerfile环境变量,并在CMD指令中使用它。通过这种方式,您可以在从Container创建Docker Image时设置环境变量。
在你的Dockerfile中,像这样的环境变量
ENV WORKERS 1然后将您的CMD指令更改为:
CMD ["sh", "-c", "gunicorn --bind :8000 --workers $WORKERS MyQ.wsgi:application"]最后,在创建Container时,使用-e参数传递您的WORKERS环境变量。
发布于 2018-07-27 15:56:43
CMD (以及ENTRYPOINT和RUN)命令有两种形式。您所写的表格是首选:
CMD ["command_name", "--option", "value"]但是,它不运行shell来预处理命令行。所以如果你跑,比如说,
CMD ["ls", ">", "/host/directory/foo.ls"]它将把>作为参数传递给程序,而不是执行shell重定向。
因此,要使构造工作,需要使用另一种形式,即将其隐式包装在shell执行(/bin/sh -c '...')中。
CMD gunicorn --bind :8000 ...实际上,尝试通过Dockerfile强制执行像worker count这样的运行时约束并不是您想要的;您应该允许在docker run命令或类似命令中指定类似的内容。@HassanMusavi的答案更好。
发布于 2018-07-27 15:57:43
Dockerfile不支持运行时参数(在运行docker文件时要计算这些参数)。但在您的示例中,您可以编写一个脚本“test.sh”,其中有带有参数的gunicorn条目。
在CMD中,像CMD["test.sh"]一样定义脚本路径。因此,当您从这个映像创建一个容器时,它将在容器中运行您的脚本,并在运行时计算$表达式并获取核心(尽管cat /proc/cpuinfo将在您的容器中运行,但它将列出您的对接机器的核心)。这样,您就不必依赖于计算核心并将其作为-e传递。
https://stackoverflow.com/questions/51561186
复制相似问题