Docker Dev Environment
Announce at start: "I'm using claude-engineer:docker-dev-environment to run services in Docker and the app native."
Iron Law
Only stateful services run in Docker. The app (frontend + backend) runs NATIVELY in its own shell.
Rationale: instant uvicorn --reload / next dev / vite HMR, real debuggers, and CI/toolchain parity -
Docker handles only the painful-to-install backing services.
The baseline services (docker-compose.yml)
- PostgreSQL - primary DB (
localhost:5432). - Redis - cache, sessions, rate-limit, job broker (
localhost:6379). - MinIO - S3-compatible object storage (
localhost:9000API /9001console) + a bucket-bootstrap step. - Mailpit - email capture for signup/reset flows (
localhost:1025SMTP /8025UI). All with healthchecks and named volumes. The native app connects vialocalhostURLs in.env.
The dev flow
docker compose up -d(services only).- Backend in shell A:
uv run uvicorn ...(native). - Frontend in shell B:
pnpm dev/bun dev/vite(native).
Non-negotiables
- Never containerize the app for local dev (the guard hook will remind you).
- Healthchecks on every service; the app waits for healthy services.
- Secrets/connection strings via
.env(git-ignored), documented.
Full detail (the complete compose file, MinIO bucket bootstrap, Mailpit SMTP config, connection settings):
read references/dev-services.md on demand.
Red flags - STOP
docker compose upthat builds/starts the app itself for local dev.- Hardcoded service URLs instead of
.env. - A service with no healthcheck.