如何在dockerfile中传递运行时参数?
我正在尝试对django项目进行dockerize,以便从我使用的shell中使用gunicorn运行该项目:如何在dockerfile中传递运行时参数?,docker,dockerfile,gunicorn,Docker,Dockerfile,Gunicorn,我正在尝试对django项目进行dockerize,以便从我使用的shell中使用gunicorn运行该项目: gunicorn --bind :8000 --workers $(( 2 * `cat /proc/cpuinfo | grep 'core id' | wc -l` + 1 )) MyQ.wsgi:application 非常有效, 其想法是尽可能多地利用gunicorn文档中定义的内核 $((2*cat/proc/cpuinfo | grep“core id”| wc-l+1)
gunicorn --bind :8000 --workers $(( 2 * `cat /proc/cpuinfo | grep 'core id' | wc -l` + 1 )) MyQ.wsgi:application
非常有效,
其想法是尽可能多地利用gunicorn文档中定义的内核
$((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 run时,此崩溃并出现以下错误:
gunicorn: error: argument -w/--workers: invalid int value: "$(( 2 * `cat /proc/cpuinfo | grep 'core id' | wc -l` + 1 ))"
因此,基本上,“$…”没有被评估,我不知道如何修复它。我认为最好在
Dockerfile
中使用ENV
指令定义一个环境变量,并在CMD
指令中使用它。这样,您可以在从Docker图像创建容器时设置环境变量
在Dockerfile
中按如下方式定义环境变量:
ENV WORKERS 1
然后将CMD
指令更改为:
CMD ["sh", "-c", "gunicorn --bind :8000 --workers $WORKERS MyQ.wsgi:application"]
最后,当您创建容器时,使用-e
参数传递WORKERS
环境变量。我认为最好在Dockerfile
中使用ENV
指令定义环境变量,并在CMD
指令中使用。这样,您可以在从Docker图像创建容器时设置环境变量
在Dockerfile
中按如下方式定义环境变量:
ENV WORKERS 1
然后将CMD
指令更改为:
CMD ["sh", "-c", "gunicorn --bind :8000 --workers $WORKERS MyQ.wsgi:application"]
最后,当您创建容器时,使用-e
参数传递WORKERS
环境变量。有两种形式的CMD
(和入口点
和运行
)命令。首选您编写的表格:
CMD ["command_name", "--option", "value"]
但是,它不会运行shell来预处理命令行。例如,如果你跑步
CMD ["ls", ">", "/host/directory/foo.ls"]
它将
作为参数传递给程序,而不执行shell重定向
因此,为了使构造正常工作,您需要使用另一种形式,即隐式地将其包装在shell执行中(/bin/sh-c'.''.'
)
实际上,试图通过Dockerfile强制执行运行时约束(如工作人员计数)并不是您想要的;您应该允许在docker run
命令或类似命令中指定类似的内容@哈桑·穆萨维的答案更好。有两种形式的CMD
(和ENTRYPOINT
和RUN
)命令。首选您编写的表格:
CMD ["command_name", "--option", "value"]
但是,它不会运行shell来预处理命令行。例如,如果你跑步
CMD ["ls", ">", "/host/directory/foo.ls"]
它将
作为参数传递给程序,而不执行shell重定向
因此,为了使构造正常工作,您需要使用另一种形式,即隐式地将其包装在shell执行中(/bin/sh-c'.''.'
)
实际上,试图通过Dockerfile强制执行运行时约束(如工作人员计数)并不是您想要的;您应该允许在docker run
命令或类似命令中指定类似的内容@HassanMusavi的答案更好。Dockerfile不支持运行时参数(您希望在运行docker文件时计算这些参数)。但在您的例子中,您可以编写一个脚本“test.sh”,其中包含带有参数的gunicorn
条目
在CMD
中定义脚本路径,如CMD[“test.sh”]
。因此,当您从该图像创建容器时,它将在容器中运行脚本,并在运行时计算$expression并获取核心(即使cat/proc/cpuinfo
将在您的容器中运行,但它将列出docker机器的核心)。这样,您就不必依赖于计算核心并将其作为-e传递。Dockerfile不支持运行时参数(您希望在运行docker文件时计算这些参数)。但在您的例子中,您可以编写一个脚本“test.sh”,其中包含带有参数的gunicorn
条目
在CMD
中定义脚本路径,如CMD[“test.sh”]
。因此,当您从该图像创建容器时,它将在容器中运行脚本,并在运行时计算$expression并获取核心(即使cat/proc/cpuinfo
将在您的容器中运行,但它将列出docker机器的核心)。通过这种方式,您不必依赖于计算核心并将其作为-e传递。您可以显示完整的流程、dockerfile中的定义以及cmd中的用法吗?有一个将环境变量放入dockerfile的示例。您可以显示完整的流程吗,dockerfile中的定义以及cmd?中的用法有一个将环境变量放入dockerfile的示例。