我可以在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"例如。
答案 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脚本?