Bird
Raised Fist0
Dockerdevops~10 mins

Environment variables in Compose in Docker - Step-by-Step Execution

Choose your learning style10 modes available
Process Flow - Environment variables in Compose
Start Compose file
↓
Read environment variables section
↓
Load variables from .env file or shell
↓
Substitute variables in service definitions
↓
Create containers with substituted values
↓
Containers run with environment variables set
↓
End
Docker Compose reads environment variables from .env or shell, substitutes them in the compose file, then creates containers with those variables set.
Execution Sample
Docker
version: '3.8'
services:
  app:
    image: alpine
    environment:
      - GREETING=${GREETING}
    command: sh -c "echo $GREETING"
This Compose file runs an Alpine container that prints the GREETING environment variable.
Process Table
StepActionEnvironment Variable SourceVariable ValueContainer Command Output
1Start docker-compose upShell or .env fileGREETING=Hello, World!
2Compose reads GREETING variableShell or .env fileHello, World!
3Substitute ${GREETING} in environment sectionCompose fileGREETING=Hello, World!
4Create container with GREETING env varContainer environmentGREETING=Hello, World!
5Run container command: sh -c "echo $GREETING"Inside containerGREETING=Hello, World!Hello, World!
6Container exits after printingN/AN/AHello, World!
💡 Container finishes running command and exits.
Status Tracker
VariableStartAfter Step 2After Step 3After Step 4Final
GREETINGundefinedHello, World!Hello, World!Hello, World!Hello, World!
Key Moments - 2 Insights
Why does the container print 'Hello, World!' instead of '${GREETING}'?
Because Compose replaces ${GREETING} with the actual value from the shell or .env file before creating the container, as shown in steps 2 and 3 of the execution table.
What happens if GREETING is not set in the shell or .env file?
The variable GREETING will be empty or undefined, so the container command will print an empty line or nothing, as Compose cannot substitute a missing variable (see step 2).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the value of GREETING after step 3?
AHello, World!
B${GREETING}
Cundefined
DGoodbye
💡 Hint
Check the 'Variable Value' column at step 3 in the execution table.
At which step does the container actually run the command that prints GREETING?
AStep 4
BStep 5
CStep 2
DStep 6
💡 Hint
Look for the step where 'Container Command Output' shows 'Hello, World!'
If GREETING was not set in the shell or .env file, what would the container output be?
AHello, World!
BAn error message
CAn empty line
D${GREETING}
💡 Hint
Refer to the key moment about missing variables and step 2 in the execution table.
Concept Snapshot
Docker Compose reads environment variables from the shell or .env file.
It substitutes variables like ${VAR} in the compose file before creating containers.
Containers receive these variables in their environment.
Commands inside containers can use these variables.
If a variable is missing, substitution results in empty value.
Use .env file or shell export to set variables before 'docker-compose up'.
Full Transcript
Docker Compose uses environment variables to customize container settings. When you run 'docker-compose up', Compose looks for variables in your shell or a .env file. It replaces placeholders like ${GREETING} in the compose file with actual values. Then it creates containers with these variables set inside. When the container runs, commands can access these variables. If a variable is missing, it becomes empty. This lets you easily change container behavior without editing the compose file.

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