docker-init
Skill8 starsChanged 48 days agoMITView on GitHub
Generates production-ready docker-compose.yml and Dockerfile(s) for a project by scanning its manifest files (package.json, pyproject.toml, Gemfile, go.mod, Cargo.toml) and source code for service dependencies (Postgres, MySQL, Redis, MongoDB, RabbitMQ, Kafka, Elasticsearch, MinIO, Mailhog, etc.), then emitting compose services with health checks, security hardening, resource limits, and non-root Dockerfiles. Use when the user asks to dockerize or containerize a project, add docker-compose, generate a Dockerfile, or set up local dev services in containers. Not for CI/CD pipeline configs (use ci-generate), database schema migrations (use db-migrate), or scanning/syncing environment variables and secrets (use env-setup).
- Reads credentials
- Installs packages
In this repository53 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- agent-browserSkill
- anything-to-skillSkill
- ci-generateSkill
- ci-localSkill
- clotho-researchSkill
- codex-imagegenSkill
- create-ruleSkill
- create-skillSkill
- db-migrateSkill
- docs-adrSkill
- docs-checkSkill
- docs-diagramSkill
- docs-initSkill
- docs-rfcSkill
- docs-updateSkill
- env-setupSkill
- find-skillsSkill
- fix-bugSkill
- git-commitSkill
- git-create-prSkill
- gitflowSkill
- git-releaseSkill
- git-syncSkill
- i18n-checkSkill
- implement-featureSkill
- improve-skillSkill
- inject-docsSkill
- jira-cliSkill
- motion-studioSkill
- optimize-ai-setupSkill
- orchestrateSkill
- oss-launchSkill
- prd-to-issuesSkill
- product-design-specSkill
- product-design-tokensSkill
- product-prdSkill
- project-illustratorSkill
- project-plannerSkill
- refactorSkill
- renderSkill
- review-codeSkill
- review-depsSkill
- review-designSkill
- review-perfSkill
- review-planSkill
- review-securitySkill
- shipSkill
- stopslopSkill
- test-suiteSkill
- vrt-checkSkill
- wtfSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
16 rules. About 0 are common, 5 are distinctive, and 11 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈5
Distinctive · estimate
This author's own choices. Worth a look.
11
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 18
Only generate configs based on what the codebase actually uses:
- Very specific: line 20
Read existing files first: if docker-compose.yml or Dockerfile already exist, read them fully before proposing any change, and ask the user …
- Distinctive: line 21
Only well-known official images: do not invent image names or tags.
- Very specific: line 22
No secrets in files: never put secrets, passwords, or API keys in compose files, use ${VAR} references pointing at .env instead.
- Very specific: line 23
Read .dockerignore before changing it, if it exists.
- Distinctive: line 53
Check for existing Docker files:
- Distinctive: line 62
Only ask about services the scan didn't already resolve:
- Very specific: line 63
If no Dockerfile exists and the scan found no app service in an existing compose file, ask whether to include one (requires …
- Very specific: line 64
If the mapping surfaced a mail-related dependency (mailhog, smtp, mailer), ask whether to add Mailhog, don't ask otherwise.
- Very specific: line 104
Write a Dockerfile for the detected stack that meets these goals:
- Very specific: line 110
No secrets in any layer: no COPY .env, no secrets in ARG/ENV.
- Very specific: line 118
Create docker-compose.prod.yml as an overlay that only holds the differences from the base file:
- Very specific: line 120
No host port publishing for backing services (ports: []).
- Very specific: line 140
If a tool is unavailable (no docker, no hadolint), skip its steps and tell the user which checks were skipped and the commands to run once …
- Very specific: line 153
No hardcoded secrets: always use ${VAR} references pointing to .env.
- Distinctive: line 154
Every service needs a health check.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Docker Init
Generate production-ready docker-compose.yml and Dockerfile with auto-detected services, health checks, resource limits, and security hardening.
Guardrails
Only generate configs based on what the codebase actually uses:
- Scan before generating: read
package.json,pyproject.toml,requirements.txt, etc. before proposing services. - Read existing files first: if
docker-compose.ymlorDockerfilealready exist, read them fully before proposing any change, and ask the user whether to update in place or regenerate. Never overwrite an existing service definition you haven't read. - Only well-known official images: do not invent image names or tags.
- No secrets in files: never put secrets, passwords, or API keys in compose files, use
${VAR}references pointing at.envinstead. - Read
.dockerignorebefore changing it, if it exists.
Workflow
Phase 1: Scan Project
Detect the tech stack and dependencies from manifest files:
# Node.js
cat package.json 2>/dev/null | grep -E '"(pg|mysql|redis|mongodb|rabbitmq|kafka|meilisearch|elasticsearch|celery)"'
# Python
cat requirements.txt pyproject.toml 2>/dev/null | grep -iE "psycopg|pymysql|redis|pymongo|pika|kafka|celery"
# Ruby
cat Gemfile 2>/dev/null | grep -E "pg|mysql|redis|mongo|sidekiq"
# Go
cat go.mod 2>/dev/null | grep -E "postgres|mysql|redis|mongo"
# Rust
cat Cargo.toml 2>/dev/null | grep -E "postgres|mysql|redis|mongo"Also scan:
- Source files for
DATABASE_URL,REDIS_URL,MONGODB_URI,RABBITMQ_URLpatterns - Existing
.env.examplefor service URLs README.mdfor setup instructions mentioning services
Check for existing Docker files:
ls docker-compose.yml docker-compose.yaml Dockerfile .dockerignore 2>/dev/nullPhase 2: Propose Services
Map detected dependencies to Docker services and show the proposal for the user to confirm/modify. See references/service-catalog.md for the full dependency-to-image mapping, load it whenever the scan surfaces a dependency not already covered by the examples in this file.
Only ask about services the scan didn't already resolve:
- If no Dockerfile exists and the scan found no app service in an existing compose file, ask whether to include one (requires
--with-dockerfile). - If the mapping surfaced a mail-related dependency (
mailhog,smtp,mailer), ask whether to add Mailhog, don't ask otherwise.
Phase 3: Generate docker-compose.yml
Generate docker-compose.yml with no version: key (deprecated in modern Compose). Every service must meet these goals:
- Official image with a pinned tag (see
references/service-catalog.md), alpine/slim variant when one exists. - A
healthcheckwithinterval,timeout,retriesand astart_periodsized to the service's boot time; commands are in the catalog. Dependents wait withdepends_on: condition: service_healthy. security_opt: [no-new-privileges:true], on every service.deploy.resources.limitsforcpusandmemory.restart: unless-stopped.- Credentials as
${VAR}references to.env, with${VAR:?required}for passwords and${VAR:-default}for harmless values such as user and database name. - Data in named volumes declared at the bottom of the file.
- Networks only as needed for segmentation: for example
frontend(app and reverse proxy),backend(app and services),db(services and databases only).
Kafka defaults to KRaft mode, not Zookeeper. A Zookeeper-backed Kafka is legacy topology and adds a second container for no benefit in a dev/prod compose file. Use the single-node KRaft form unless the user explicitly asks for a Zookeeper-based cluster:
services:
kafka:
image: apache/kafka:latest # pin to a specific tag (e.g. 3.8.0) before deploying to prod
environment:
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka:9093
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
healthcheck:
test: ["CMD-SHELL", "kafka-broker-api-versions.sh --bootstrap-server localhost:9092"]
interval: 10s
timeout: 5s
retries: 5
security_opt:
- no-new-privileges:trueHealth check commands for other services (Postgres, MySQL, Redis, MongoDB, RabbitMQ, MinIO) are in references/service-catalog.md.
Phase 4: Generate Dockerfile (if --with-dockerfile)
Write a Dockerfile for the detected stack that meets these goals:
- Multi-stage: dependencies and build tooling in a build stage, only runtime dependencies and build output in the final stage (no compilers, dev dependencies or package-manager caches).
- Slim or alpine base image pinned to a specific version tag, the same major version the project declares (
.nvmrc,engines,requires-python,go.mod). - Dependency manifests copied and installed before the source, so the dependency layer caches; installs use the lockfile (
npm ci,uv sync --frozen,bundle config set deployment true). - A dedicated non-root user created in the final stage and activated with
USERbeforeCMD. - No secrets in any layer: no
COPY .env, no secrets inARG/ENV; use BuildKit--mount=type=secretwhen a build needs one. - A
HEALTHCHECKwhen the app serves HTTP or another probeable port; skip it for workers and CLIs. EXPOSEfor the real port, and exec-formCMD.
Also write a .dockerignore that excludes VCS data, .env*, dependency directories, caches and build output, and the Dockerfile and compose files themselves.
Phase 5: Generate Production Overlay (if --prod)
Create docker-compose.prod.yml as an overlay that only holds the differences from the base file:
- No host port publishing for backing services (
ports: []). restart: always.- Tighter
deploy.resources.limitsthan the dev defaults. - Bounded
json-filelogs (max-size,max-file).
Phase 6: Validate
Copy this checklist and tick each step:
- [ ] hadolint Dockerfile (skip if no Dockerfile)
- [ ] docker build -t <project>-check . (skip if no Dockerfile)
- [ ] docker compose config --quiet (add -f docker-compose.yml -f docker-compose.prod.yml if --prod)
- [ ] .dockerignore exists and .env is in .gitignorehadolint install: brew install hadolint, or without installing, docker run --rm -i hadolint/hadolint < Dockerfile.
Fix every finding, then re-run the failed step and the ones after it. Stop after 3 rounds and report what still fails. Don't suppress a hadolint rule to get green unless the reason is stated to the user.
If a tool is unavailable (no docker, no hadolint), skip its steps and tell the user which checks were skipped and the commands to run once the tool is available. Never claim a check passed that was not run.
Remind the user to add real secrets to .env.
Argument Parsing
--services <list>: Comma-separated list of additional services (e.g.,--services postgres,redis,meilisearch)--prod: Also generatedocker-compose.prod.ymlwith production settings--with-dockerfile: Also generateDockerfileand.dockerignore
Important Notes
- No
version:field in compose files: deprecated in modern Docker Compose. - No hardcoded secrets: always use
${VAR}references pointing to.env. - Every service needs a health check; without one, startup ordering between dependent services is unreliable.
- App containers run as non-root: create the user in the Dockerfile and switch with
USER. - Set
deploy.resources.limitson every service to prevent a runaway container from starving the host. - Production Dockerfiles use multi-stage builds to keep the final image small.
Examples
# Auto-detect and generate docker-compose.yml
/docker-init
# Generate with specific services
/docker-init --services postgres,redis,meilisearch
# Generate compose + Dockerfile
/docker-init --with-dockerfile
# Full production setup
/docker-init --with-dockerfile --prodDoes it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

