Docker Environment Variables
Environment variables are used to configure applications inside containers.
Setting Environment Variables
When Running a Container
# One variable at a time
docker run -d -e DB_HOST=localhost myapp
# Multiple variables
docker run -d \
-e DB_HOST=localhost \
-e DB_PORT=5432 \
-e DB_NAME=mydb \
myapp
From a File
# Create a .env file
echo "DB_HOST=localhost" > .env
echo "DB_PORT=5432" >> .env
# Use the .env file
docker run -d --env-file .env myapp
In a Dockerfile
ENV DB_HOST=localhost
ENV DB_PORT=5432
ENV NODE_ENV=production
Use Case: Application Configuration
# docker-compose.yml
version: '3.8'
services:
api:
build: ./backend
environment:
- NODE_ENV=production
- DB_HOST=database
- DB_PORT=5432
- DB_NAME=myapp
- DB_USER=admin
- DB_PASSWORD=${DB_PASSWORD}
- REDIS_HOST=cache
env_file:
- .env
database:
image: postgres:15
environment:
POSTGRES_DB: myapp
POSTGRES_USER: admin
POSTGRES_PASSWORD: ${DB_PASSWORD}
.env File
# .env
DB_PASSWORD=secret123
REDIS_PASSWORD=redis456
API_KEY=abc123
NODE_ENV=production
Everyday Use Case
Case: A developer needs different configuration for development and production.
# Development
docker run -d \
-e NODE_ENV=development \
-e DEBUG=true \
-e DB_HOST=localhost \
myapp
# Production
docker run -d \
-e NODE_ENV=production \
-e DEBUG=false \
-e DB_HOST=database \
-e DB_PASSWORD_FILE=/run/secrets/db_password \
myapp
Secrets Management
# Docker Compose with secrets
version: '3.8'
services:
api:
environment:
DB_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_password
secrets:
db_password:
file: ./secrets/db_password.txt
Best Practices
- Don't hardcode secrets: Use environment variables
- Use a .env file: For local development
- Use Docker secrets: For production
- Document: List all the required variables
- Default values: Provide default values where possible
Conclusion
Environment variables separate configuration from code. Use .env for development and Docker secrets for production.