SKILL.md
Dockerize and Deploy
Containerize a repo and produce a deployment setup, one phase at a time.
Workflow
1. Audit
Identify runtime, services, datastores, build step, existing Docker files, and env vars. Propose phases before writing.
2. Phases
- Dockerfile — multi-stage: builder installs/compiles, runtime copies artifacts only, non-root user, pinned base image (e.g.
node:20.11-alpine),.dockerignoreexcludesnode_modules/.env/.git. - docker-compose — dev stack: source mounts for hot reload, debug ports, named volumes.
- Production compose (
docker-compose.prod.yml) — no source mounts,restart: unless-stopped, healthchecks, explicit volumes,mem_limit/cpuslimits. See [REFERENCE.md](REFERENCE.md). - Pre-flight — copy
scripts/preflight.shinto the project; validates env vars, Docker, port conflicts, DB reachability, dry-run build. Run:bash scripts/preflight.sh. - Deploy —
scripts/deploy.sh: runpreflight.sh(abort on fail) → pull/build image → run migrations → rolling restart → health-check → print status.
Merge or skip phases for simple repos.
3. Verify after each phase
docker build -t app:test . # Dockerfile compiles
docker compose config # compose files are valid YAML
docker compose up -d && docker compose ps # services start healthy
bash scripts/preflight.sh # pre-flight passes
Guardrails
- Never embed secrets in Docker/compose files.
- Always run containers as a non-root user.
- No
latestimage tags in production — pin versions. - DB volumes: named volumes only, never host bind mounts.
- No
.env.example? Create one first.
References
- [REFERENCE.md](REFERENCE.md) — volume/healthcheck patterns, resource limits, multi-stage examples by runtime, rolling deploy strategies.