Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在dockerfile中传递运行时参数?_Docker_Dockerfile_Gunicorn - Fatal编程技术网

如何在dockerfile中传递运行时参数?

如何在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)

我正在尝试对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))部分只返回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的示例。