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 inspect
或 docker 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]
我 运行 一个 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
.
我也用 centos Docker 图像观察到这种行为。为什么不能使用 docker inspect
或 docker 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]