请确保您的Dockerfile声明了一个环境变量使用ENV
:
ENV environment default_env_value
ENV cluster default_cluster_value
ENV <key> <value>
表单可以 内联替换。
然后,您可以使用 docker run
传递环境变量。请注意,每个变量都需要特定的 -e
标志才能运行。
docker run -p 9000:9000 -e environment=dev -e cluster=0 -d me/app
或者你可以通过compose文件设置它们:
node:
environment:
- environment=dev
- cluster=0
你的 Dockerfile CMD
可以使用该环境变量,但是,正如 问题 5509 中所提到的那样,你需要以 sh -c
的形式来使用它:
CMD ["sh", "-c", "node server.js ${cluster} ${environment}"]
解释是shell负责扩展环境变量,而不是Docker。当您使用
JSON语法时,您明确要求您的命令绕过shell直接执行。
与
Builder RUN(也适用于
CMD
)相同的思路:
与shell表单不同,exec表单不会调用命令shell。
这意味着不会发生常规的shell处理。
例如,
RUN [ "echo", "$HOME" ]
将不会对
$HOME
进行变量替换。如果要使用shell处理,则使用shell表单或直接执行shell,例如:
RUN [ "sh", "-c", "echo $HOME" ]
。
在使用exec表单并直接执行shell的情况下,就像使用shell表单一样,是shell在执行环境变量扩展,而不是docker。
正如Pwnstar在评论中所指出的:
当您使用shell命令时,该进程将不会以id=1
启动。