在CMD中使用环境变量

时间:2014-04-14 22:00:08

标签: environment-variables docker

我可以在Dockerfile的CMD节中使用环境变量吗?

我想做这样的事情:

CMD ["myserver", "--arg=$ARG", "--memcache=$MEMCACHE_11211_TCP_ADDR:$MEMCACHE_11211_TCP_PORT"]

其中$ MEMCACHE_11211_TCP_ *将通过包含my docker run命令的--link参数自动设置。并且$ ARG可由用户在运行时配置,也可以由" -e"参数β

这对我来说似乎没有用,它似乎正在通过字符串" $ ARG"例如。

4 个答案:

答案 0 :(得分:42)

这个答案可能有点晚了。但CMD的环境的解释略有不同,具体取决于您如何编写参数。如果将CMD作为字符串传递(不在数组中),它将作为shell而不是exec启动。请参阅https://docs.docker.com/engine/reference/builder/#cmd

您可以尝试不使用数组语法的CMD作为shell运行:

CMD myserver --arg=$ARG --memcache=$MEMCACHE_11211_TCP_ADDR:$MEMCACHE_11211_TCP_PORT

答案 1 :(得分:21)

CMD ["sh", "-c", "echo ${MY_HOME}"]

来自sffits here的答案。

答案 2 :(得分:11)

Andys都说对了。 json语法绕过入口点。当您在示例中使用CMD时,它被视为默认入口点的参数:/bin/sh -c将解释环境变量。

在任何一种情况下,Docker都不会评估CMD中的变量。在前者中,直接调用命令,因此不会解释任何内容,在后面,变量由sh解释。

答案 3 :(得分:7)

我不能说假设如何工作,但我想如果你把它称为shell脚本,例如CMD runmyserver.sh,那么shell变量的解释将推迟到CMD实际运行。

所以,试试

myserver --arg=$ARG --memcache=$MEMCACHE_11211_TCP_ADDR:$MEMCACHE_11211_TCP_PORT`` 

作为shell脚本?