【问题标题】:Passing environment variable to container is not working将环境变量传递给容器不起作用
【发布时间】:2018-12-23 02:39:23
【问题描述】:
我有这个命令:
docker run -e "DB_HOST=thehost" --rm my_application echo $DB_HOST
但它什么也没显示。我期待显示“thehost”。
我试过用单引号、双引号和不带引号。
我错过了什么?我需要在 my_aplication 的 Dockerfile 中指定 ENV 参数吗?
如果我这样做:
docker run -e "DB_HOST=thehost" --rm my_application echo $PATH
它正确显示了 PATH 值。但它忽略了我的环境变量。
【问题讨论】:
标签:
docker
environment-variables
【解决方案1】:
这里有几层东西:
- 您的本地 shell 扩展命令;
- 启动一些 Docker 容器;
- 运行其他进程(但不一定是 shell)。
在你的第一个例子中
docker run ... echo $DB_HOST
您的本地 shell 在变量引用被传递到 Docker 之前捕获它。
如果你明确地单引号
docker run ... echo '$DB_HOST'
Docker 将找到 /bin/echo(假设它存在于容器中)并使用字符串 $DB_HOST 作为参数启动它,但同样,由于 Docker 端不涉及 shell,它尽职尽责地将该字符串打印为是。
你的问题的直接答案是强制在 Docker 端有一个 shell
docker run -e DB_HOST=thehost --rm my_application \
sh -c 'echo $DB_HOST'
略高一点:
- 如果您正在运行其他语言的程序,而不仅仅是一个 shell 命令,它们会正常看到环境(Python 的
os.environ、Ruby 的 ENV、Node 的 process.env、等。)
- 如果您有任何甚至有点复杂的东西,请将其写入 shell 脚本,将其复制到图像中,然后运行可能更易于维护,并且隐含涉及 shell(第一行将显示
#!/bin/sh)李>
- 在你的 Dockerfile 中,如果你说
CMD some command,Docker 会自动将它包装在一个 shell 中;相当于CMD ["sh", "-c", "some command"]
-
ENTRYPOINT 也是如此,但这样使用它可能是一个错误