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
, 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.
You can use
printenv VARIABLE
instead of/bin/bash -c 'echo $VARIABLE
. It's much simpler and it does not perform substitution:@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:It's not very pretty, but it gets the job done.
To then get the value, use:
The proper way to run
echo "$ENV_VAR"
inside the container so that the variable substitution happens in the container is:The downside of using
docker exec
is that it requires a running container, sodocker 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:
the output will look like this:
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:will output:
Example #3. Let's modify the example above to get a bash friendly output which can be directly used in your scripts:
will output:
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 withrun
, you won't get any output).Simply
run
withprintenv
, like so:(Note that
docker-compose
instead ofdocker
works too)To view all env variables:
To get one: