docker容器中的环境变量 - 它是如何工作的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker容器中的环境变量 - 它是如何工作的?相关的知识,希望对你有一定的参考价值。

我无法理解一些事情,即我们知道我们可以传递给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守护程序。

以上是关于docker容器中的环境变量 - 它是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

如何持久化docker中的环境变量

Docker 镜像和容器的 DevOps 和环境变量

从 docker-compose 替换 NGINX 配置中的环境变量

如何在 docker 容器中定义环境变量以与我的 jar 文件一起使用 [重复]

Docker容器网络代理设置

Docker:容器管理(启动参数,查看容器和日志,进入和修改容器)