简体   繁体   中英

Get Environment Variable from Docker Container

What's the simplest way to get an environment variable from a docker container that has not been declared in the Dockerfile ?

For instance, an environment variable that has been set through some docker exec container /bin/bash session?

I can do docker exec container env | grep ENV_VAR docker exec container env | grep ENV_VAR , but I would prefer something that just returns the value.

I've tried using docker exec container echo "$ENV_VAR" , but the substitution seems to happen outside of the container, so I don't get the env var from the container, but rather the env var from my own computer.

Thanks.

在容器内运行echo "$ENV_VAR"以便在容器中发生变量替换的正确方法是:

docker exec <container_id> bash -c 'echo "$ENV_VAR"'

To view all env variables:

docker exec container env

To get one:

docker exec container env | grep VARIABLE | cut -d'=' -f2

You can use printenv VARIABLE instead of /bin/bash -c 'echo $VARIABLE . It's much simpler and it does not perform substitution:

docker exec container printenv VARIABLE

The downside of using docker exec is that it requires a running container, so docker inspect -f might be handy if you're unsure a container is running.

Example #1. Output a list of space-separated environment variables in the specified container:

docker inspect -f \
   '{{range $index, $value := .Config.Env}}{{$value}} {{end}}' container_name

the output will look like this:

ENV_VAR1=value1 ENV_VAR2=value2 ENV_VAR3=value3

Example #2. Output each env var on new line and grep the needed items, for example, the mysql container's settings could be retrieved like this:

docker inspect -f \
    '{{range $index, $value := .Config.Env}}{{println $value}}{{end}}' \
    container_name | grep MYSQL_

will output:

MYSQL_PASSWORD=secret
MYSQL_ROOT_PASSWORD=supersecret
MYSQL_USER=demo
MYSQL_DATABASE=demodb
MYSQL_MAJOR=5.5
MYSQL_VERSION=5.5.52

Example #3. Let's modify the example above to get a bash friendly output which can be directly used in your scripts:

docker inspect -f \
   '{{range $index, $value := .Config.Env}}export {{$value}}{{println}}{{end}}' \
   container_name | grep MYSQL

will output:

export MYSQL_PASSWORD=secret
export MYSQL_ROOT_PASSWORD=supersecret
export MYSQL_USER=demo
export MYSQL_DATABASE=demodb
export MYSQL_MAJOR=5.5
export MYSQL_VERSION=5.5.52

If you want to dive deeper, then go to Go's text/template package documentation with all the details of the format.

None of the above answers show you how to extract a variable from a non-running container (if you use the echo approach with run , you won't get any output).

Simply run with printenv , like so:

docker run --rm <container> printenv <MY_VAR>

(Note that docker-compose instead of docker works too)

One more since we are dealing with json

docker inspect <NAME|ID> | jq '.[] | .Config.Env'

Output sample

[
  "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
  "NGINX_VERSION=1.19.4",
  "NJS_VERSION=0.4.4",
  "PKG_RELEASE=1~buster"
]

如果您有机会使用VSCode并安装了docker 扩展,只需右键+单击要检查的docker (在docker 扩展中),单击Inspect ,然后搜索env ,您将找到所有env 变量

We can modify entrypoint of a non-running container with the docker run command.

Example show PATH environment variable:

  1. using bash and echo : This answer claims that echo will not produce any output, which is incorrect.

     docker run --rm --entrypoint bash <container> -c 'echo "$PATH"'
  2. using printenv

     docker run --rm --entrypoint printenv <container> PATH

@aisbaa's answer works if you don't care when the environment variable was declared. If you want the environment variable, even if it has been declared inside of an exec /bin/bash session, use something like:

IFS="=" read -a out <<< $(docker exec container /bin/bash -c "env | grep ENV_VAR" 2>&1)

It's not very pretty, but it gets the job done.

To then get the value, use:

echo ${out[1]}

This command inspects docker stack processes' environment in the host :

pidof   dockerd containerd containerd-shim | tr ' ' '\n' \
      | xargs -L1 -I{} -- sudo xargs -a '/proc/{}/environ' -L1 -0

The first way we use to find the ENV variables is docker inspect <container name>

The second way is docker exec <4 alphanumeric letter of CONTAINER id> bash -c 'echo "$ENV_VAR"'

There is a misconception in the question, that causes confusion:

you cannot access a "running session" , so no bash session can change anything.

docker exec -ti container /bin/bash

starts a new console process in the container, so if you do export VAR=VALUE this will go away as soon as you leave the shell, and it won't exist anymore.

Perhaps a good example:

# assuming TESTVAR did not existed previously this is empty 
docker exec container env | grep TESTVAR

# -> TESTVAR=a new value!
docker exec container /bin/bash -c 'TESTVAR="a new value!" env' | grep TESTVAR

# again empty
docker exec container env | grep TESTVAR

The variables from env come from the Dockerfile or command, docker itself and whatever the entrypoint sets.

The other answers here are good. But if you really need to get the environmental properties used when starting a program, then you can inspect the /proc/pid/environ contents in the container, where pid is the container process id of the running comand.

# environmental props 
docker exec container cat /proc/pid/environ | tr '\0' '\n'

# you can check this is the correct pid by checking the ran command
docker exec container cat /proc/pid/cmdline | tr '\0' ' '

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM