我有这个命令:
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 值。但它忽略了我的环境变量。
最佳答案
这里有几个层次:
- 您的本地 shell 扩展命令;
- 启动一些 Docker 容器;
- 它运行一些其他进程(但不一定是 shell)。
在你的第一个例子中
docker run ... echo $DB_HOST
您的本地 shell 在变量引用传递给 Docker 之前捕获它。
如果你显式地单引号
docker run ... echo '$DB_HOST'
Docker 将找到 /bin/echo
(假设它存在于容器中)并使用字符串 $DB_HOST
作为参数启动它,但同样,因为没有 shell涉及到 Docker 端,它尽职尽责地按原样打印出该字符串。
您问题的直接答案是强制在 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
, etc.) - 如果您有任何复杂的东西,将它写入一个 shell 脚本,将其复制到一个图像中,然后运行它可能更易于维护,并且隐含地涉及一个 shell(第一行将显示
#!/bin/sh
) - 在您的 Dockerfile 中,如果您输入
CMD some command
,Docker 会自动将其包装在一个 shell 中;这相当于CMD ["sh", "-c", "some command"]
ENTRYPOINT
也是如此,但这样使用它可能是一个错误
关于docker - 将环境变量传递给容器不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53900818/