Bird
Raised Fist0
Dockerdevops~5 mins

Environment variables in Compose in Docker - Commands & Configuration

Choose your learning style10 modes available
Introduction
Environment variables let you set values outside your app code so you can change settings easily. In Docker Compose, they help you configure containers without changing the Compose file itself.
When you want to set a database password without writing it directly in the Compose file.
When you need to run the same app in different environments like development and production with different settings.
When you want to share common settings like ports or API keys across multiple services in Compose.
When you want to keep sensitive information out of version control but still use it in your containers.
Config File - docker-compose.yml
docker-compose.yml
version: '3.8'
services:
  webapp:
    image: nginx:1.23
    ports:
      - "8080:80"
    environment:
      - APP_ENV=production
      - API_KEY=${API_KEY}

This Compose file defines a service named webapp using the nginx image.

The environment section sets two variables: APP_ENV is set directly to 'production', and API_KEY is set from the host environment variable API_KEY.

This allows you to keep sensitive keys outside the file and inject them when running Compose.

Commands
This command sets the environment variable API_KEY in your shell so Docker Compose can use it.
Terminal
export API_KEY=12345secretkey
Expected OutputExpected
No output (command runs silently)
This command starts the services defined in docker-compose.yml in detached mode, applying the environment variables.
Terminal
docker-compose up -d
Expected OutputExpected
Creating network "default" with the default driver Creating webapp ... done
→
-d - Run containers in the background (detached mode)
This command runs printenv inside the running webapp container to show the values of the environment variables.
Terminal
docker-compose exec webapp printenv APP_ENV API_KEY
Expected OutputExpected
production 12345secretkey
This command stops and removes the containers, networks, and other resources created by docker-compose up.
Terminal
docker-compose down
Expected OutputExpected
Stopping webapp ... done Removing webapp ... done Removing network default
Key Concept

If you remember nothing else from this pattern, remember: environment variables let you change container settings without editing the Compose file.

Common Mistakes
Not exporting the environment variable in the shell before running docker-compose up.
Docker Compose cannot substitute the variable if it is not set in the shell, so the container gets an empty or missing value.
Always export the needed environment variables in your shell before running docker-compose up.
Writing environment variables directly in the Compose file for sensitive data like passwords.
This exposes secrets in version control and shared files, risking security.
Use shell environment variables or .env files ignored by version control to keep secrets safe.
Using incorrect syntax like APP_ENV: production instead of the list format or key-value pairs under environment.
Docker Compose expects environment variables in a specific format; wrong syntax causes errors or ignored variables.
Use either a list with - VAR=value or a map with VAR: value under the environment key.
Summary
Set environment variables in your shell to pass dynamic values to Docker Compose.
Use the environment section in docker-compose.yml to define variables for containers.
Verify variables inside containers using docker-compose exec and printenv.
Stop and clean up containers with docker-compose down.

Practice

(1/5)
1. What is the main purpose of using environment in a Docker Compose file?
easy
A. To set environment variables inside containers
B. To define network settings for containers
C. To specify the container image version
D. To mount volumes from the host

Solution

  1. Step 1: Understand the role of environment variables

    Environment variables allow customization of container behavior without changing the container image or code.
  2. Step 2: Identify what environment does in Compose

    The environment key in Docker Compose sets these variables inside the container at runtime.
  3. Final Answer:

    To set environment variables inside containers -> Option A
  4. Quick Check:

    environment sets variables = C [OK]
Hint: Remember: environment = variables inside container [OK]
Common Mistakes:
  • Confusing environment with network or volume settings
  • Thinking environment sets image versions
  • Mixing environment with Dockerfile commands
2. Which of the following is the correct syntax to pass an environment variable named API_KEY with value 12345 in a Docker Compose service?
easy
A. set_env: - API_KEY: 12345
B. environment: - API_KEY=12345
C. variables: API_KEY=12345
D. env: API_KEY: 12345

Solution

  1. Step 1: Recall Docker Compose environment syntax

    Docker Compose uses the environment key with a list or dictionary to set variables.
  2. Step 2: Match correct syntax for list format

    The correct list format is environment:\n - API_KEY=12345. Other keys like env, variables, or set_env are invalid.
  3. Final Answer:

    environment: - API_KEY=12345 -> Option B
  4. Quick Check:

    Correct key and list syntax = D [OK]
Hint: Use 'environment:' with dash and equals for variables [OK]
Common Mistakes:
  • Using wrong keys like env or variables
  • Mixing colon and equals signs incorrectly
  • Indentation errors in YAML
3. Given this Compose snippet:
version: '3'
services:
  app:
    image: myapp
    environment:
      - MODE=${APP_MODE}
If the host environment variable APP_MODE is set to production, what will be the value of MODE inside the container?
medium
A. MODE
B. ${APP_MODE}
C. production
D. undefined

Solution

  1. Step 1: Understand variable substitution in Compose

    Compose replaces ${APP_MODE} with the value of the host environment variable APP_MODE when starting containers.
  2. Step 2: Apply substitution with given host variable

    Since APP_MODE is set to production on the host, MODE inside the container will be production.
  3. Final Answer:

    production -> Option C
  4. Quick Check:

    Host var substitution = production [OK]
Hint: Host vars replace ${VAR} in Compose environment [OK]
Common Mistakes:
  • Thinking ${APP_MODE} stays as literal string
  • Assuming variable is undefined inside container
  • Confusing container env with host env
4. You wrote this Compose snippet:
services:
  web:
    image: nginx
    environment:
      - PORT: 80
But the container does not get the PORT variable set. What is the error?
medium
A. Missing quotes around 80
B. environment key should be under volumes
C. Image name is incorrect
D. Using colon instead of equals sign in environment list

Solution

  1. Step 1: Check environment variable syntax in list form

    When using a list under environment, variables must be in KEY=VALUE format, not KEY: VALUE.
  2. Step 2: Identify the error in the snippet

    The snippet uses - PORT: 80 which is invalid YAML for a list item; it should be - PORT=80.
  3. Final Answer:

    Using colon instead of equals sign in environment list -> Option D
  4. Quick Check:

    List env vars use = not : [OK]
Hint: Use '=' for list env vars, ':' only in dict format [OK]
Common Mistakes:
  • Mixing list and dictionary syntax for environment
  • Thinking quotes are mandatory for numbers
  • Placing environment under wrong keys
5. You want to pass a default value for an environment variable LOG_LEVEL in Compose if the host variable is unset or empty. Which syntax correctly sets LOG_LEVEL to info by default?
hard
A. environment: - LOG_LEVEL=${LOG_LEVEL:-info}
B. environment: LOG_LEVEL: info
C. environment: - LOG_LEVEL=info
D. environment: - LOG_LEVEL=${LOG_LEVEL-info}

Solution

  1. Step 1: Understand Compose variable default syntax

    Compose supports shell-style default values using ${VAR:-default} to use default if VAR is unset or empty.
  2. Step 2: Identify correct syntax for default

    ${LOG_LEVEL:-info} sets LOG_LEVEL to host value if set, else info. Other options either ignore host variable or use incorrect syntax.
  3. Final Answer:

    environment: - LOG_LEVEL=${LOG_LEVEL:-info} -> Option A
  4. Quick Check:

    Use ${VAR:-default} for defaults [OK]
Hint: Use ${VAR:-default} to set default env var in Compose [OK]
Common Mistakes:
  • Using ${VAR-default} which does not handle empty values
  • Setting static value ignoring host variable
  • Wrong YAML indentation or syntax
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard