Skip to main content

[SOLVED] How do I pass environment variables to Docker containers? - docker

Mastering Docker: A Simple Guide on Passing Environment Variables to Docker Containers

In Docker, knowing how to pass environment variables to containers is very important. This helps us manage settings and deploy applications. Environment variables let us change how our apps work inside Docker containers. We can do this without changing the container image itself. In this chapter, we will look at different ways to pass environment variables to Docker containers. This will help our applications run with the right settings in different places.

Solutions We Will Talk About:

  • Solution 1: Using the -e Flag in Docker Run
  • Solution 2: Using an Environment File with --env-file
  • Solution 3: Defining Environment Variables in Dockerfile
  • Solution 4: Using Docker Compose to Set Environment Variables
  • Solution 5: Passing Variables at Runtime with Docker Compose
  • Solution 6: Overriding Environment Variables in Docker Containers

By the end of this chapter, we will understand how to use these methods. This will help us improve our Docker work and make our application deployments easier. For more details on Docker and other related topics, we can check these links: Why Doesn’t My Python App Print? and How to Copy Files from Host to Docker. Let’s start!

Solution 1 - Using the -e Flag in Docker Run

One easy way to pass environment variables to Docker containers is to use the -e flag in the docker run command. This lets us set environment variables right when we start a container.

Syntax

docker run -e VARIABLE_NAME=value image_name

Example

Imagine we have a Docker image called my_app. We want to pass an environment variable named ENVIRONMENT with the value production. We would run this command:

docker run -e ENVIRONMENT=production my_app

We can also pass more than one environment variable by using more -e flags:

docker run -e ENVIRONMENT=production -e DEBUG=false my_app

Accessing Environment Variables

Inside our application running in the Docker container, we can access these environment variables using standard ways based on the programming language we use. For example, in Python, we can access it like this:

import os

environment = os.getenv('ENVIRONMENT')
print(environment)  # Outputs: production

Important Considerations

  • Make sure the names of the environment variables are good identifiers.
  • Be careful with sensitive data like API keys. We should think about using Docker Secrets for production situations.

Using the -e flag is a simple way to set environment variables when we run a container. For more complex setups, we can look at solutions like using an environment file with –env-file.

Solution 2 - Using an Environment File with –env-file

We can manage environment variables for Docker containers by using an environment file. This method lets us keep all our environment variables in one file. We can refer to this file when we run our Docker container. This is very helpful when we have many variables or when we want to keep our settings organized and safe.

Steps to Use an Environment File

  1. Create an Environment File: First, we create a file named .env or any name we like. We list our environment variables in this format KEY=VALUE. For example:

    DB_HOST=localhost
    DB_USER=root
    DB_PASS=secret
  2. Run Docker with the –env-file Option: Next, we use the --env-file option when we run our Docker container. This will load the environment variables from the file we created. Here is how we can do it:

    docker run --env-file .env -d your-image-name

    This command runs the Docker container in detached mode with the environment variables from the .env file.

Example

Let’s say we have a Docker image for a web app that needs database settings. Our .env file may look like this:

DB_HOST=db.example.com
DB_PORT=5432
DB_USER=myuser
DB_PASS=mypassword

To run our Docker container with these variables, we can execute:

docker run --env-file .env -p 80:80 -d my-web-app

Benefits of Using an Environment File

  • Organization: It helps us keep all environment variables in one file. This makes it easier to manage.
  • Security: We can keep sensitive information like passwords out of our Docker run command history.
  • Ease of Use: We can change environment variables easily without changing our Docker command.

For more information about managing environment variables and Docker commands, we can check out the documentation on Docker Compose for more tips on container management practices.

Solution 3 - Defining Environment Variables in Dockerfile

We can define environment variables right in our Dockerfile using the ENV instruction. This lets us set environment variables that will be available to all containers made from the image. It is a simple way to set application settings, API keys, and other important variables without passing them when the container runs.

Syntax

The basic syntax for the ENV instruction is:

ENV <key>=<value>

We can also define many environment variables in one line by separating them with a space:

ENV <key1>=<value1> <key2>=<value2>

Example

Here is a simple example of how we can define environment variables in a Dockerfile:

# Use an official Python runtime as a parent image
FROM python:3.9-slim

# Set environment variables
ENV APP_ENV=production
ENV DATABASE_URL="postgres://user:password@hostname:port/dbname"
ENV DEBUG=false

# Set the working directory
WORKDIR /app

# Copy the current directory contents into the container at /app
COPY . /app

# Install dependencies
RUN pip install -r requirements.txt

# Run the application
CMD ["python", "app.py"]

Accessing Environment Variables

In our application code, we can access these environment variables using the right method for the programming language. For example, in Python, we can use the os module:

import os

app_env = os.getenv('APP_ENV')
database_url = os.getenv('DATABASE_URL')
debug = os.getenv('DEBUG')

Benefits

  • Consistency: By defining environment variables in the Dockerfile, we make sure every container has the same setup.
  • Simplicity: This way is easier when running containers since we do not need to specify variables at runtime.
  • Layering: Environment variables in a Dockerfile are part of the image layers. This makes them reusable for different containers.

For more details on working with Dockerfiles, check out this guide on Dockerfile basics.

Using environment variables in our Dockerfile helps us manage settings better. By using the ENV instruction, we can make our container process smoother and keep our application’s environment clear.

Solution 4 - Using Docker Compose to Set Environment Variables

We can use Docker Compose to manage multi-container Docker apps. It is a good way to set environment variables. This helps us configure our containers in a simple and clear way.

Setting Environment Variables in docker-compose.yml

We can define environment variables right in our docker-compose.yml file. We put them under the environment section for each service. Here is an example:

version: "3.8"

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    environment:
      - ENV_VAR1=value1
      - ENV_VAR2=value2

In this example, the web service runs an Nginx container. It has two environment variables, ENV_VAR1 and ENV_VAR2, with their values set.

Using an Environment File with Docker Compose

We can also use an external .env file to manage environment variables. Docker Compose reads this file and sets the variables for our services.

  1. First, we create a file named .env in the same folder as our docker-compose.yml:
ENV_VAR1=value1
ENV_VAR2=value2
  1. Next, we reference these variables in our docker-compose.yml:
version: "3.8"

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    environment:
      - ENV_VAR1
      - ENV_VAR2

In this setup, Docker Compose will replace ENV_VAR1 and ENV_VAR2 with the values from the .env file when we start the containers.

Overriding Environment Variables

We can also change environment variables that we defined in the docker-compose.yml or the .env file. We do this by setting them in our shell before running Docker Compose. For example:

ENV_VAR1=new_value docker-compose up

This command will start our Docker container with ENV_VAR1 set to new_value. ENV_VAR2 will keep its original value from the .env file.

Example of Accessing Environment Variables

Inside our application that runs in the container, we can access these environment variables. We use the right method for our programming language. For example, in a Python app, we can do this:

import os

env_var1 = os.getenv('ENV_VAR1')
env_var2 = os.getenv('ENV_VAR2')
print(f'ENV_VAR1: {env_var1}, ENV_VAR2: {env_var2}')

This way, we can manage configuration easily and keep things consistent across different environments. Using Docker Compose to set environment variables helps our app work better and lowers the chance of mistakes in configuration.

For more details on Docker Compose, you can check this guide on Docker Compose.

Solution 5 - Passing Variables at Runtime with Docker Compose

When we work with Docker Compose, we can send environment variables at runtime. This helps us change how our containers behave. It’s very helpful for testing different setups without changing our docker-compose.yml file.

Method to Pass Variables

We can send environment variables to our services using the command line when we run docker-compose. Here are the steps:

  1. Using Environment Variables in the Command Line:
    We can set environment variables directly in the command line before we run Docker Compose commands. For example:

    MY_ENV_VAR=value docker-compose up

    In our docker-compose.yml, we can use this variable like this:

    version: "3"
    services:
      my_service:
        image: my_image
        environment:
          - MY_ENV_VAR=${MY_ENV_VAR}
  2. Using a .env File:
    Docker Compose looks for a file named .env in the same folder as our docker-compose.yml file. We can create this file to set our environment variables:

    # .env
    MY_ENV_VAR=value
    ANOTHER_VAR=another_value

    Then, we can use these variables in our docker-compose.yml like this:

    version: "3"
    services:
      my_service:
        image: my_image
        environment:
          - MY_ENV_VAR
          - ANOTHER_VAR
  3. Environment Variable Substitution:
    Docker Compose allows variable substitution in the docker-compose.yml file. If we have set variables in our .env file, we can use them in our config:

    version: "3"
    services:
      web:
        image: nginx
        environment:
          - NGINX_HOST=${MY_ENV_VAR}

Example Usage

Here is a full example of how we can set this up:

  1. Create a .env file:

    # .env
    MYSQL_ROOT_PASSWORD=rootpassword
    MYSQL_DATABASE=mydb
  2. Create a docker-compose.yml file:

    version: "3.8"
    services:
      db:
        image: mysql:5.7
        environment:
          MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
          MYSQL_DATABASE: ${MYSQL_DATABASE}
        ports:
          - "3306:3306"
  3. Run Docker Compose:
    Now we can run our Docker Compose setup:

    docker-compose up

This will start our MySQL container with the environment variables we set at runtime. By using these methods, we can easily handle our environment variables in Docker Compose. This lets us have flexible and changing container setups.

For more advanced setups or specific cases, we can check other resources on Docker Compose that might help us.

Solution 6 - Overriding Environment Variables in Docker Containers

Overriding environment variables in Docker containers helps us change how our applications work at runtime. We do not need to change the original Docker image. This is very useful when we need to adapt our applications for different settings like development, testing, or production.

Method 1: Overriding with the -e Flag

We can override environment variables when we run a container with the docker run command. We use the -e flag for this. It is simple and lets us set or change variables on-the-fly.

Example:

docker run -e MY_ENV_VAR=some_value my_docker_image

In this example, MY_ENV_VAR gets the value some_value in the running container.

Method 2: Using an Environment File

If we have many environment variables to set, it is better to store them in a file. Then we can use the --env-file option to load them into the container. This way is more organized and easier to handle.

  1. First, we create a file named .env (or any name we like) and add our environment variables:
MY_ENV_VAR=some_value
ANOTHER_VAR=another_value
  1. Next, we run our container with the --env-file option:
docker run --env-file .env my_docker_image

This command will load all variables from the .env file into the container.

Method 3: Overriding Variables in Docker Compose

When we use Docker Compose, we can also override environment variables in our docker-compose.yml file. We can list them under the environment section of our service.

Example:

version: "3"
services:
  my_service:
    image: my_docker_image
    environment:
      - MY_ENV_VAR=some_value
      - ANOTHER_VAR=another_value

When we run docker-compose up, these variables will replace any that are in the Dockerfile or from the parent environment.

Method 4: Using Dockerfile for Defaults

We can set default environment variables in our Dockerfile with the ENV instruction. But we can still override them at runtime using the methods we mentioned. Here is how we can set a default:

FROM alpine
ENV MY_ENV_VAR=default_value

If we run a container from this image without the -e flag, MY_ENV_VAR will be default_value. But if we give a different value when we run it, that value will take priority.

Important Considerations

  • Order of Precedence: Environment variables set with the -e flag or in a .env file will override those in the Dockerfile.
  • Accessing Variables: We need to make sure our application can access the environment variables. For example, in a Python app, we can get them using os.environ.

For more information on managing Docker environments, check the Docker Compose documentation and the Docker environment variables overview.

Conclusion

In this article, we looked at different ways to pass environment variables to Docker containers. We talked about using the -e flag, environment files, and Docker Compose. Knowing these methods helps us set up and manage our container apps better.

For more tips on using Docker, we can check out our guides on communicating between containers and Docker Compose.

Comments