When we create a Docker container, sometimes, we have the need of passing “arguments” to it, typically, port numbers for services, or some paths.
For this, we configure the environment variables of the container, and that’s what this example is going to show.
For this example, Linux Mint 18 and Docker version 1.12.1 have been used.
You may skip Docker installation and jump directly to the beginning of the example below.
Note: Docker requires a 64-bit system with a kernel version equal or higher to 3.10.
We can install Docker simply via
apt-get, without the need of adding any repository, just installing the
sudo apt-get update sudo apt-get install docker.io
For more details, you can follow the Install Docker on Ubuntu Tutorial.
2. What are environment variables?
When we talk about environment variables in Docker context, we are talking about the variables that we pass to a container, that will be set in its environment. Pretty easy, as you can see.
Let’s see a practical case, executing the
env command inside a container. In my case, is a container named
busybox1, based on a Busybox image, that we have created just running:
docker run -i -t -d --name=busybox1 busybox
-d options are for keeping the container alive, detached).
Now, we can execute the
docker exec busybox1 env
Receiving the following output:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=0fd687d954b0 TERM=xterm HOME=/root
Showing the list of the environment variables set in our container.
Note that the concept is exactly the same than in Linux, but applied in Docker context. Now we will see how to deal with environment variables in Docker containers.
3. Setting environment variables
Is essential to understand that the environment variables are set in container instantiation, that is, when we execute the
For this, we have to use the
--env) option. The format is the following:
docker run -e <variable1>='<value1>' [-e <variableN>='<valueN>'] <image>
There are a couple of things that we have to take into account:
- We have to pass the
-efor each variable.
- The quotes for the value are only required for values including whitespaces, but it’s always good to follow the same convention, adding them always.
Let’s see an example, creating the container and executing the
env command (inside the container; not a Docker command), and seeing the output:
docker run -e variable1='value1' -e variable2='value2' busybox env
The shown output is:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=b7ab4a51b363 variable1=value1 variable2=value2 HOME=/root
3.1. Reading environment variables from a file
Docker gives the chance of reading the environment variables from a file, which is especially useful when we have a large list of variables and we want to reuse them.
The format this file has to follow is very simple, it’s just about setting a
var=val in different lines, for example:
This file does not have to have any specific naming; we can set the name and extension we want.
Also, note that we shouldn’t use quotes if we use a environment variable list file: if we use them, the quotes will be part of the value itself.
For specifying this file when instantiating the image, we have to use the
docker run --env-file=<path/to/file> <image>
docker run --env-file=./env.list busybox env
If we execute the command shown above, we will see that the printed environment variable list is the same as in previous occasions, but now being defined in a file.
We can also combine the usage of the file, and the specification of the variables inline:
docker run --env-file=./env.list -e variable3=value3 busybox env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=0e0361c22eae variable1=value1 variable2=value2 variable3=value3 HOME=/root
Of course, we have to be cautious with the redefinitions: if a variable is defined in both file and inline, the one defined inline will have precedence. This means that, for the previous
env.list, if we also define the following inline variable:
docker run --env-file=./env.list -e variable2=value3 busybox env
The value set in the container for
variable2 will be
value3, instead of
4. Environment variables in Dockerfiles
Of course, we can set environmental variables in our Dockerfiles. For this, we have to use the
There are several ways for using this instruction:
# Without equality sign, specifying the 'ENV' instruction in each line ENV variable1 value1 ENV variable2 value2 # With the equality sign, without the need of specifying 'ENV' for every assignment, but using '\' ENV variable1=value1\ variable2=value2
As for inline variables, we have to use quotes for values containing whitespaces.
So a simple Dockerfile for doing what we have done in the previous sections could be:
FROM busybox ENV variable1=value1\ variable2=value2
Then, we build the image from this Dockerfile:
docker build --tag=mybusybox . # The path to my Dockerfile
And run it, showing the environment variables:
docker run mybusybox env
And we will see the expected output:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=d677d9eac45b variable1=value1 variable2=value2 HOME=/root
In this tutorial, we have seen how to set environment variables of containers at instantiation time, as a method of passing arguments to them. We have started with the most basic solution, that consists on passing the arguments inline one by one; and then how to define them in a file, which can be more comfortable for some situations; and, also, for our own Dockerfiles.