How one can Go Atmosphere Variables to Docker Containers


Applications typically management operation by way of configuration bundled with the software program, and setting variables enable customers to set them at runtime. Nonetheless, operating processes in Docker containers complicates issues, so how do you move setting variables to a container?

What Are Atmosphere Variables Used For?

Atmosphere variables help you decouple the configuration from the applying’s executable. For instance, you wouldn’t wish to retailer your manufacturing database password in your codebase—should you did, it could be seen from Git, and anybody with entry to your code may take down your database.

As a substitute, you set it with an setting variable, which shops a easy key-value pair, and means that you can entry the worth in any software operating in the identical shell session (they’re not globally accessible).  This additionally has the good thing about having the ability to simply outline totally different configuration for various environments. For instance, having separate keys for growth and manufacturing databases, or utilizing a unique API endpoint.

Setting these variables for Docker containers might be executed in three major methods—with CLI arguments, .env config information, or by way of docker-compose.

With a Command Line Argument

The command used to launch Docker containers, docker run, accepts ENV variables as arguments. Merely run it with the -e flag, shorthand for --env, and move in the important thing=worth pair:

sudo docker run 
-e POSTGRES_USER='postgres' 
-e POSTGRES_PASSWORD='password' 
...

And, if you have already got these setting variables set within the setting that’s operating that command, you’ll be able to simply move them in instantly by title:

// set variable
POSTGRES_PASSWORD='password'

// use it later
docker run -e POSTGRES_PASSWORD -e POSTGRES_USER ...

Further Safety With an .env File

Passing variables with CLI arguments works nice, nevertheless it has a draw back—these variables are seen from the host. They’re logged within the command historical past, and visual within the course of itemizing for the launched course of.

Linux has a in-built strategy to handle permissions for this—file entry. Storing the variables in an .env file means that you can management entry to that file with file permissions (chmod, chown).

Create an .env file with variables within the following format, every on a brand new line:

POSTGRES_PASSWORD='password'
POSTGRES_USER='postgres'
APPLICATION_URL='instance.com'

Then, move it to docker run with the --env-file flag:

docker run --env-file ./envfile ...

With Docker-Compose

After all, many individuals don’t launch Docker containers instantly with docker run, and as a substitute decide to make use of a docker-compose file to deal with the configuration of a number of containers all representing a single software.

To move setting variables to a container launched this manner, you’ll have to configure the compose file to move the session’s variables by way of to the Docker container. This configuration right here passes the POSTGRES_USER variable to each the construct setting and the runtime setting, and units a default worth if it doesn’t exist.

model: '3.1'
providers:
  my-service: 
    construct:
      context: .
      args:
        - POSTGRES_USER=${POSTGRES_USER:-default}
    setting: 
      - POSTGRES_USER=${POSTGRES_USER:-default}

You will want to set the setting variables earlier than operating docker-compose up, in any other case it will be unable to entry them. You may retailer them within the compose file, however that’s often tracked and versioned, which defeats the aim of env variables.

With Kubernetes

Kubernetes is an orchestration system that may deal with operating lots of of containers throughout a community. It nonetheless makes use of Docker, however you’ll solely ever contact configuration, so passing setting variables instantly received’t work.

As a substitute, you’ll be able to outline them within the configuration for the Pod:

apiVersion: v1
sort: Pod
metadata:
  title: instance
spec:
  containers:
    - ...
      env:
        - title: SERVICE_PORT
          worth: "80"
        - title: SERVICE_IP
          worth: "172.17.0.1"

Kubernetes is sophisticated, and there are loads of alternative ways to work with setting variables. To be taught extra, you’ll be able to learn their guides on injecting knowledge into Pods.



Supply hyperlink