当docker run上的入口点为echo时,为什么未设置env变量?

时间:2019-01-18 15:58:53

标签: docker docker-entrypoint docker-run

为什么环境变量对于作为入口点运行的命令不可见?
范例:

$docker run -it -e "name=JD" --entrypoint 'echo' ubuntu 'Hello $name'
Hello $name  
$ docker run -it -e "name=JD" --entrypoint 'echo' ubuntu "Hello $name"
Hello  

但是,当我启动shell时,环境变量在那里:

$ docker run -it -e "name=JD" ubuntu /bin/bash
root@c3e513390184:/# echo "$name"
JD

为什么在以echo作为入口点的第一种情况下,它找不到env变量集?

1 个答案:

答案 0 :(得分:0)

第一种情况

docker run -it -e "name=JD" --entrypoint 'echo' ubuntu 'Hello $name'

单引号始终防止字符串变量扩展。无论您用单引号写的内容都保持不变。在您的终端中尝试echo '$PWD',您将看到$PWD作为输出。尝试echo "$PWD",您将打印出工作目录。

第二种情况

docker run -it -e "name=JD" --entrypoint 'echo' ubuntu "Hello $name"

在运行之前,先扩展您的代码。您的shell展开整个字符串,然后执行它。目前,您没有声明$name,但将其清空。这意味着在容器内部您将获得"Hello "命令,而不是"Hello $name"

如果要从容器内部回显环境变量,最简单的方法是将脚本包装到sh文件中以防止其扩展并将此文件传递给容器。

我想第三种情况很明显,不需要解释。