Docker 检查命令未显示所有 ENV 变量

Docker inspect command not showing all the ENV vars

我 运行 一个 Alpine Docker 容器使用以下命令:

docker run -itd --env "my_env_var=test" --name mycontainer alpine

现在,当我从 Docker 容器中 运行 env 命令获取所有环境变量时,我得到以下输出:

$ docker exec -it mycontainer /bin/sh
$ env
HOSTNAME=9de9045b5264
SHLVL=1
HOME=/root
my_env_var=test
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/

到目前为止,还不错。

但是当我尝试使用 docker inspect 命令获取环境变量时,我发现 缺少太多 ENV 变量(只找到其中​​的 2 个) :

$ docker inspect mycontainer
...
...
"Env": [
            "my_env_var=test",
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
        ],
...
...

此外,我使用 docker exec 命令使用以下命令打印 ENV 变量:

$ docker exec mycontainer /bin/sh -c env
HOSTNAME=9de9045b5264
SHLVL=1
HOME=/root
my_env_var=test
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/

这一次,除了 TERM=xterm.

之外的所有 ENV 变量都显示了

我也用 centos Docker 图像观察到这种行为。为什么不能使用 docker inspectdocker exec 打印所有 ENV 变量?

Why is it so that all the ENV vars are not getting printed using docker inspect or docker exec?

因为 /bin/sh 设置了它们。

发生这种情况是因为这些环境变量是由您用来显示它们的二进制文件设置的 - 这里 /bin/sh

Linux 发行版中有一些机制允许您为交互式 shell 设置变量,例如 /etc/profile 引用 only one out of them.

运行 的更好命令,以便更接近您的 inspect 命令给您的内容:

docker exec mycontainer env

给出

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=1fbc89f485c2
my_env_var=test
HOME=/root

对于为您提供 TERM 变量的不同命令,这是由 docker 的 -t 选项引起的:

--tty, -t Allocate a pseudo-TTY

我们可以使用

来展示这个
docker exec mycontainer env

给出

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=1fbc89f485c2
my_env_var=test
HOME=/root

docker exec -t mycontainer env

给出

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=1fbc89f485c2
TERM=xterm
my_env_var=test
HOME=/root

关于 docker inspect 用法的小注释:您还可以使用 format 标志过滤输出以仅获取您需要的信息:

例如:

docker inspect mycontainer --format "{{.Config.Env}}"

给予

[my_env_var=test PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin]