How Can I Pass Environment Variables to Docker Containers?

To pass environment variables to Docker containers, we can use several ways. These include the Docker command line, Dockerfile, Docker Compose, and env files. Each method helps us set important settings and secrets. This way, our applications can run well in containerized environments. It is important for us to understand how to manage environment variables. This helps us improve our Docker workflow and makes our applications more flexible.

In this article, we will look at different ways to pass environment variables to Docker containers. We will talk about these methods:

  • How Can I Pass Environment Variables to Docker Containers Using the Docker Command Line
  • How Can I Pass Environment Variables to Docker Containers Using a Dockerfile
  • How Can I Pass Environment Variables to Docker Containers Using Docker Compose
  • How Can I Pass Environment Variables to Docker Containers Using an Env File
  • How Can I Pass Environment Variables to Docker Containers Using Runtime Variables
  • Frequently Asked Questions

By the end, we will understand how to manage environment variables well in our Docker setup. If you want to learn more about Docker basics, you can check what is Docker and why should you use it and how Docker differs from virtual machines.

How Can We Pass Environment Variables to Docker Containers Using the Docker Command Line

We can pass environment variables to Docker containers while they run. We do this by using the -e or --env option with the docker run command. This lets us set up environment variables for how our container will work.

Example:

docker run -e MY_ENV_VAR=value my_image

We can also pass many environment variables at once:

docker run -e VAR1=value1 -e VAR2=value2 my_image

If we want to pass environment variables from our host’s environment, we can use the --env-file option. This reads variables from a file. Each line in the file must follow the format KEY=VALUE.

Example of env file (env.list):

MY_ENV_VAR=value
ANOTHER_VAR=another_value

Running with the env file:

docker run --env-file ./env.list my_image

To check that the environment variables are set inside the container, we can run a command like env or printenv:

docker run -e MY_ENV_VAR=value my_image env

This will show all the environment variables. So we can see if MY_ENV_VAR is set.

Using the Docker command line to pass environment variables helps our applications have the right setup. We avoid hardcoding values in our image or code. For more information on Docker and what it can do, check out What are the benefits of using Docker in development.

How Can We Pass Environment Variables to Docker Containers Using a Dockerfile

We can pass environment variables to Docker containers by using the ENV command in a Dockerfile. This lets us define environment variables that our application inside the container can use.

Syntax

ENV <key>=<value> ...

Example Dockerfile

Here is a simple example of setting environment variables in a Dockerfile:

# Use an official base image
FROM ubuntu:latest

# Set environment variables
ENV APP_ENV=production
ENV DB_HOST=db.example.com
ENV DB_USER=root
ENV DB_PASS=secret

# Install dependencies and copy application files
RUN apt-get update && apt-get install -y python3

# Copy application code
COPY . /app

# Set the working directory
WORKDIR /app

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

In this Dockerfile: - We use the ENV command to set APP_ENV, DB_HOST, DB_USER, and DB_PASS as environment variables. - Our application code can access these variables when it runs in the container.

Accessing Environment Variables in Application Code

In a Python application, we can get these environment variables using the os module:

import os

app_env = os.getenv('APP_ENV')
db_host = os.getenv('DB_HOST')
db_user = os.getenv('DB_USER')
db_pass = os.getenv('DB_PASS')

print(f"Environment: {app_env}, DB Host: {db_host}, User: {db_user}")

Build the Docker Image

To build the Docker image with this Dockerfile, we can use this command:

docker build -t myapp .

Run the Docker Container

Then, we can run the container and our environment variables will be available:

docker run myapp

Using a Dockerfile to set environment variables is a good way to handle configuration settings in our containerized applications. For more information about Docker and what it can do, we can read what is Docker and why should you use it.

How Can I Pass Environment Variables to Docker Containers Using Docker Compose

To pass environment variables to Docker containers with Docker Compose, we can define them in the docker-compose.yml file. Here’s how we can do it:

  1. Inline in the docker-compose.yml:

    We can write environment variables directly under the service definition.

    version: '3.8'
    services:
      web:
        image: nginx
        environment:
          - NODE_ENV=production
          - API_URL=http://api.example.com
  2. Using a .env file:

    We can also create a .env file in the same folder as our docker-compose.yml. Docker Compose will load the variables from this file.

    .env file:

    NODE_ENV=production
    API_URL=http://api.example.com

    docker-compose.yml:

    version: '3.8'
    services:
      web:
        image: nginx
        environment:
          - NODE_ENV
          - API_URL
  3. Using the env_file option:

    We can specify an external file for environment variables using the env_file option.

    docker-compose.yml:

    version: '3.8'
    services:
      web:
        image: nginx
        env_file:
          - .env
  4. Runtime Variables:

    We can change environment variables at runtime when we start our Docker Compose app using the command line:

    NODE_ENV=production API_URL=http://api.example.com docker-compose up

This way allows us to manage the configuration in our Docker containers. It makes it easier to deploy apps in different environments. For more details about Docker Compose and what it can do, we can check the Docker Compose documentation.

How Can I Pass Environment Variables to Docker Containers Using an Env File

To pass environment variables to Docker containers using an .env file, we can follow these steps:

  1. Create the .env File: First, we need to make a file called .env in our project folder. In this file, we write our environment variables like this: KEY=VALUE. For example:

    DATABASE_URL=mysql://user:password@host:port/dbname
    API_KEY=your_api_key
  2. Using the .env File in Docker Run: When we run a Docker container, we can use the --env-file option to tell Docker to use our env file. Here is how we do it:

    docker run --env-file .env your_image_name
  3. Using the .env File in Docker Compose: If we use Docker Compose, we can add the .env file in the docker-compose.yml file. Docker Compose will read the .env file from the current folder automatically. Here is an example:

    version: '3'
    services:
      app:
        image: your_image_name
        env_file:
          - .env
  4. Accessing Environment Variables: Inside the container, we can get the environment variables just like we do in our application. We can use our programming language’s methods or libraries to access them.

By using an .env file, we can easily manage and pass many environment variables to our Docker containers. This helps us with our application’s configuration management. For more details about Docker, we can check what is Docker and why should you use it.

How Can We Pass Environment Variables to Docker Containers Using Runtime Variables

We can pass environment variables to Docker containers when we run them. We use the -e or --env option with the docker run command. This helps us define environment variables right from the command line when starting a container.

Example

docker run -e MY_ENV_VAR=my_value my_image

In this example, we set MY_ENV_VAR to my_value inside the container created from my_image.

Multiple Environment Variables

We can also pass many environment variables by using the -e option more than once:

docker run -e VAR1=value1 -e VAR2=value2 my_image

Using Environment Variable from Host

We can use existing environment variables from our host system by referencing them:

docker run -e MY_ENV_VAR=${HOST_VAR} my_image

If HOST_VAR is set in our host’s environment, its value goes to MY_ENV_VAR in the container.

Environment Variables with Docker Compose

When we use Docker Compose, we can pass runtime variables directly in the docker-compose.yml file:

version: '3'
services:
  my_service:
    image: my_image
    environment:
      - MY_ENV_VAR=my_value

This makes it easier to manage environment variables for many services.

Summary

Using runtime variables with the docker run command is a simple way to pass environment settings to Docker containers. We do not need to change Dockerfiles or Compose files. For more details about Docker usage, we can check this article on Docker environment variables.

Frequently Asked Questions

1. How do we set environment variables in a Docker container?

We can set environment variables in a Docker container in different ways. We can use command line options, Dockerfiles, Docker Compose, or .env files. For example, when using the Docker command line, we can use the -e flag with KEY=VALUE when we run a container. This helps us pass settings and secrets easily.

2. Can we use an env file to pass environment variables to Docker?

Yes, we can use an .env file to send environment variables to Docker containers. The .env file should have key-value pairs like KEY=VALUE. When we use Docker Compose, we can mention the .env file in our docker-compose.yml. This helps us manage our environment variables better and keep private data safe.

3. What is the difference between passing environment variables in Docker and Docker Compose?

Passing environment variables in Docker means using command line flags or Dockerfiles. Docker Compose gives us a more organized way to do this with a docker-compose.yml file. Docker Compose can also use .env files. This makes it easier to manage many containers and their settings all in one place.

4. How can we access environment variables inside a running Docker container?

We can access environment variables inside a running Docker container by using the printenv or echo command in the terminal. For example, we can run docker exec -it <container_name> /bin/sh -c 'echo $MY_VARIABLE' to see the value of a specific environment variable.

5. Are there any security issues when using environment variables in Docker?

Yes, we need to think about security when we use environment variables in Docker. Sensitive information like API keys or passwords must be handled carefully. It is best to use Docker secrets for sensitive data, especially in production. We should also avoid putting sensitive information directly in Dockerfiles or files that we share.

For more details on Docker and related topics, we can check articles like What is Docker and Why Should You Use It? and What are the Benefits of Using Docker in Development?.