Skip to content

Docker Compose

Two approaches for injecting secrets into Docker Compose services.

Section titled “Approach 1: Wrap the Command (Recommended)”

Run docker compose under skret run -- so all secrets are available as environment variables:

Terminal window
skret run -- docker compose up -d

Docker Compose inherits the environment from its parent process. Secrets set by skret run are passed to containers via the environment directive in docker-compose.yml:

services:
app:
image: myapp:latest
environment:
- DATABASE_URL
- REDIS_URL
- API_KEY

Each listed variable is forwarded from the host environment (set by skret) into the container. This is the cleanest approach — no .env file on disk.

up-app:
skret run -- docker compose up -d app
down-app:
docker compose down app
logs:
docker compose logs -f app

For tools or workflows that require a .env file:

Terminal window
skret env > .env
docker compose up -d

Reference in docker-compose.yml:

services:
app:
image: myapp:latest
env_file:
- .env

Drawbacks:

  • Secrets written to disk (even temporarily)
  • Must regenerate .env when secrets change
  • Must ensure .env is in .gitignore

If you must use .env, regenerate it before each start:

up-app:
skret env > .env
docker compose up -d app
rm -f .env
down-app:
docker compose down app
Aspectskret run --skret env > .env
Secrets on diskNoYes (temporary)
Auto-updatesYes (fetched each run)No (manual regenerate)
Works offlineOnly with local providerYes, once generated
Docker Compose versionAnyAny
CI/CD friendlyYesYes
Terminal window
# Start development services (pull from dev SSM path or local .secrets.dev.yaml)
skret --env=dev run -- docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d
# Start production services
skret --env=prod run -- docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d

Environment names are whatever you defined in .skret.yamlprod/dev is the minimal pair; add staging, qa, preview, etc. if your workflow needs them.

If you currently use .env files with Docker Compose:

Terminal window
# 1. Import existing .env into skret
skret import --from=dotenv --file=.env
# 2. Verify secrets were imported
skret list
# 3. Switch docker-compose.yml from env_file to environment
# Before:
# env_file: .env
# After:
# environment:
# - DATABASE_URL
# - REDIS_URL
# 4. Run with skret
skret run -- docker compose up -d
# 5. Remove .env once confirmed
rm .env