I ran an Alpine Docker container using the following command:
docker run -itd --env "my_env_var=test" --name mycontainer alpine
Now when I run the env
command from inside the Docker container to get all the Env vars, I get the following output:
[root@ip-172-31-46-169 ~]# docker exec -it mycontainer /bin/sh
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=/
So far, so good.
But when I try to get the Environment Variables using the docker inspect
command, I see that too many ENV vars are missing (Only 2 of them are found):
[root@ip-172-31-46-169 ~]# docker inspect mycontainer
...
...
"Env": [
"my_env_var=test",
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
...
...
Also, I used the docker exec
command to print the ENV vars using the following command:
[root@ip-172-31-46-159 ~]# 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=/
This time, all the ENV vars were displayed except for the TERM=xterm
.
I observed this behaviour with centos Docker images as well. Why is it so that all the ENV vars are not getting printed using docker inspect
or docker exec
?
CodePudding user response:
Why is it so that all the ENV vars are not getting printed using docker inspect or docker exec?
Because /bin/sh
sets them.
CodePudding user response:
This happens because those environment variables are set by the binaries you are using to display them — here /bin/sh
.
There are mechanisms in Linux distribution allowing you setting variables for an interactive shell, like /etc/profile to cite only one out of them.
A better command to run in order to have something closer to what your inspect
command would give you would be:
docker exec mycontainer /usr/bin/env
Which gives
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=1fbc89f485c2
my_env_var=test
HOME=/root
For the different commands that are giving you the TERM
variable, this is caused by the -t
option of docker:
--tty
,-t
Allocate a pseudo-TTY