在 CMD 中使用环境变量
Posted
技术标签:
【中文标题】在 CMD 中使用环境变量【英文标题】:Use environment variables in CMD 【发布时间】:2014-05-29 01:39:59 【问题描述】:我可以在 Dockerfile 的 CMD 节中使用环境变量吗?
我想做这样的事情:
CMD ["myserver", "--arg=$ARG", "--memcache=$MEMCACHE_11211_TCP_ADDR:$MEMCACHE_11211_TCP_PORT"]
$MEMCACHE_11211_TCP_* 将通过包含我的docker run
命令的 --link 参数自动设置。并且 $ARG 可以由用户在运行时配置,也许可以通过“-e”参数?
这似乎对我不起作用,例如,它似乎实际上是通过字符串“$ARG”。
【问题讨论】:
【参考方案1】:这个答案可能有点晚了。但是 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
【讨论】:
如果您使用CMD string
方法,当您使用docker run my-image
时Ctrl-C
可能会停止工作,因为shell 获取中断而不是由CMD
启动的进程。 【参考方案2】:
CMD ["sh", "-c", "echo $MY_HOME"]
来自 sffits 的回答 here。
【讨论】:
【参考方案3】:两个安迪都说对了。 json 语法绕过入口点。当您在他们的示例中使用 CMD 时,它被视为默认入口点的参数:/bin/sh -c
,它将解释环境变量。
在这两种情况下,Docker 都不评估 CMD 中的变量。前者直接调用命令,不解释,后者由sh
解释变量。
【讨论】:
【参考方案4】:我无法说明它是如何工作的,应该,但我认为如果你将其称为 shell 脚本,例如CMD runmyserver.sh
,那么 shell 变量的解释将推迟到 CMD 实际运行。
所以,试试
myserver --arg=$ARG --memcache=$MEMCACHE_11211_TCP_ADDR:$MEMCACHE_11211_TCP_PORT``
作为 shell 脚本?
【讨论】:
以上是关于在 CMD 中使用环境变量的主要内容,如果未能解决你的问题,请参考以下文章