Docker Compose — Env File Directive
The env_file: directive loads environment variables into the container from one or more files.
Basic Usage
.env.api:
NODE_ENV=production
PORT=3000
DATABASE_URL=postgres://user:pass@db:5432/mydb
compose.yml:
services:
api:
image: node:20-alpine
env_file:
- .env.api
Multiple Files
services:
api:
image: node:20-alpine
env_file:
- .env.common
- .env.api
- .env.secrets
Files are loaded in order. Later files override earlier ones.
File Format Rules
# Comments start with #
NODE_ENV=production
PORT=3000
# Quotes are optional but recommended for special characters
DATABASE_URL="postgres://user:pass@db:5432/mydb"
# Empty lines are ignored
# NO spaces around = sign
# BAD: NODE_ENV = production
# GOOD: NODE_ENV=production
env_file vs environment
services:
api:
image: node:20-alpine
env_file:
- .env.api # Loaded first
environment:
NODE_ENV: staging # Overrides env_file value
Priority order (highest wins):
| Priority | Source |
|---|---|
| 1 (highest) | environment: in compose.yml |
| 2 | Host shell variables (pass-through) |
| 3 | env_file: values |
| 4 | Dockerfile ENV defaults |
Optional Env Files
Use required: false (Compose v2.24+) to make a file optional:
services:
api:
env_file:
- path: .env.api
required: true
- path: .env.local
required: false # Won't fail if missing
Best Practice: Separate Files per Environment
.env.common # Shared across all environments
.env.development # Dev-specific
.env.staging # Staging-specific
.env.production # Prod-specific (in .gitignore!)
Summary
| Feature | Detail |
|---|---|
| Load from file | env_file: [.env.api] |
| Multiple files | Listed in order, last wins |
| Format | KEY=value, one per line |
| Override by | environment: key wins |
| Optional files | required: false (v2.24+) |
Quick Reference
| Item | Detail |
|---|---|
| env_file: | Load vars from file into container |
| Format | KEY=value, # for comments |
| Order | Later files override earlier |
| Override | environment: always wins over env_file |
| Optional | required: false (Compose v2.24+) |