Skillversitas

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

  1. Don't hardcode secrets: Use environment variables
  2. Use a .env file: For local development
  3. Use Docker secrets: For production
  4. Document: List all the required variables
  5. Default values: Provide default values where possible

Conclusion

Environment variables separate configuration from code. Use .env for development and Docker secrets for production.