在 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-imageCtrl-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 中使用环境变量的主要内容,如果未能解决你的问题,请参考以下文章

windows环境变量如何在cmd中打印

cmd里面如何分别查看系统环境变量和用户环境变量?

python需要配置环境变量吗

java环境变量设置路径成功后在cmd中还是存在问题

使用cmd命令快速查看和添加系统环境变量

cmd环境变量?