我无法理解一些事情,即我们知道我们可以传递给docker run
论证-e SOME_VAR=13
。
然后启动的每个进程(例如使用docker exec ping localhost -c $SOME_VAR=13
)都可以看到此变量。
它是如何工作的 ?毕竟,环境是关于bash,我们不发布bash。我无法理解。你能解释一下-e
如何在没有shell的情况下工作吗?
例如,让我们看下面的例子:
[user@user~]$ sudo docker run -d -e XYZ=123 ubuntu sleep 10000
2543e7235fa9
[user@user~]$ sudo docker exec -it 2543e7235fa9 echo test
test
[user@user~]$ sudo docker exec -it 2543e7235fa9 echo $XYZ
<empty row>
为什么我得到<empty row>
而不是123
?
问题是你的$ XYZ是在主机shell环境中插入的,而不是你的容器。
$ export XYZ=456
$ docker run -d -e XYZ=123 ubuntu sleep 10000
$ docker exec -it $(docker ps -ql) echo $XYZ
$ 456
$ docker exec -it $(docker ps -ql) sh -c 'echo $XYZ'
$ 123
你必须引用它,所以它作为字符串文字传递给容器。然后它工作正常。
环境不是特定于shell的。即使普通的流程也有环境。它们对shell和普通进程的工作方式相同。这是因为shell是普通的进程。
当您执行SOMEVAR=13 someBinary
时,您为新进程someBinary定义了一个名为SOMEVAR的环境变量。你可以在docker中使用-e
执行此操作,因为您要求另一个进程启动您的进程,即docker守护程序。