Advanced SDL
Advanced configuration options and patterns.
Environment Variables
services:
api:
image: node:20-alpine
env:
- NODE_ENV=production
- PORT=3000
- DATABASE_URL=postgres://user:pass@db:5432/mydb
- API_KEY=secret123
Security
Environment variables are visible in manifest. Don't put sensitive secrets here in production. Use volume-mounted config files or secrets management service instead.
Multi-Service Deployments
services:
api:
image: node:20-alpine
expose:
- port: 3000
as: 3000
to:
- global: true
env:
- DATABASE_URL=postgres://db:5432/app
db:
image: postgres:15-alpine
env:
- POSTGRES_PASSWORD=changeme
params:
storage:
data:
mount: /var/lib/postgresql/data
source: uploads
profiles:
compute:
api:
resources:
cpu:
units: 1
memory:
size: 1Gi
db:
resources:
cpu:
units: 0.5
memory:
size: 2Gi
storage:
- size: 10Gi
deployment:
api:
anywhere:
profile: api
count: 1
db:
anywhere:
profile: db
count: 1
Services in the same deployment can communicate via service names as hostnames. The API can connect to db:5432 using Docker's built-in DNS.
Resource Profiles
Define different resource profiles for different service types:
profiles:
compute:
# Lightweight web server
web:
resources:
cpu:
units: 0.25
memory:
size: 256Mi
# Memory-intensive API
api:
resources:
cpu:
units: 2
memory:
size: 4Gi
# Database with storage
database:
resources:
cpu:
units: 1
memory:
size: 2Gi
storage:
- size: 50Gi
Placement Constraints
Control where your deployments run:
deployment:
web:
anywhere: # Run on any available provider
profile: web
count: 1
# Future: region-specific placement
# us-east:
# profile: web
# count: 2