Agent skill
docker-init
Generate Dockerfiles and docker-compose.yml with auto-detected services, health checks, security hardening, and resource limits.
Install this agent skill to your Project
npx add-skill https://github.com/mgiovani/cc-arsenal/tree/main/skills/docker-init
Metadata
Additional technical details for this skill
- author
- mgiovani
- version
- 1.0.0
SKILL.md
Docker Init
Cross-Platform AI Agent Skill This skill works with any AI agent platform that supports the skills.sh standard.
Generate production-ready docker-compose.yml and Dockerfile with auto-detected services, health checks, resource limits, and security hardening.
Anti-Hallucination Guidelines
CRITICAL: Only generate compose configs based on what the codebase actually uses:
- Scan before generating — Read
package.json,pyproject.toml,requirements.txt, etc. before proposing services - Check for existing files — Read existing
docker-compose.ymlorDockerfilebefore overwriting - Validate images — Only use well-known official images; do not invent image tags
- No secrets in files — Never put secrets, passwords, or API keys in compose files; use
env_file - Check .dockerignore — If it exists, read it before suggesting changes
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/null
If files exist, read them before proposing changes and ask user whether to update or create fresh.
Phase 2: Propose Services
Map detected dependencies to Docker services. Show the proposal and let user confirm/modify:
Dependency-to-service mapping:
| Detected | Proposed Service | Default Image |
|---|---|---|
pg, psycopg, postgres |
PostgreSQL | postgres:16-alpine |
mysql, pymysql |
MySQL | mysql:8.0 |
redis, ioredis |
Redis / Valkey | redis:7-alpine |
mongodb, pymongo |
MongoDB | mongo:7 |
rabbitmq, pika, amqp |
RabbitMQ | rabbitmq:3-management-alpine |
kafka, confluent |
Kafka + Zookeeper | confluentinc/cp-kafka:latest |
meilisearch |
Meilisearch | getmeili/meilisearch:latest |
elasticsearch |
Elasticsearch | elasticsearch:8.12.0 |
celery, sidekiq |
Redis (queue backend) | redis:7-alpine |
mailhog, smtp, mailer |
Mailhog | mailhog/mailhog:latest |
minio, s3 |
MinIO | minio/minio:latest |
Always ask:
- "Should I include a service for your app itself? (requires Dockerfile)"
- "Should I add Mailhog for local email testing?"
Phase 3: Generate docker-compose.yml
Generate docker-compose.yml (no version: field — modern standard) with:
Every service must include:
services:
postgres:
image: postgres:16-alpine
environment:
POSTGRES_USER: ${POSTGRES_USER:-app}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?required}
POSTGRES_DB: ${POSTGRES_DB:-app_development}
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-app}"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
restart: unless-stopped
networks:
- db
deploy:
resources:
limits:
cpus: '1'
memory: 512M
Security defaults (applied to every service):
security_opt:
- no-new-privileges:true
Network segmentation (create as needed):
networks:
frontend: # App <-> reverse proxy
backend: # App <-> services
db: # Services <-> databases only
Volumes at the bottom:
volumes:
postgres_data:
redis_data:
Health check patterns per service:
| Service | Health Check |
|---|---|
| Postgres | pg_isready -U ${USER} |
| MySQL | mysqladmin ping -h localhost |
| Redis | redis-cli ping |
| MongoDB | mongosh --eval "db.adminCommand('ping')" |
| RabbitMQ | rabbitmq-diagnostics -q ping |
| MinIO | mc ready local |
Phase 4: Generate Dockerfile (if --with-dockerfile)
Generate a multi-stage Dockerfile for the detected stack:
Node.js example:
# Build stage
FROM node:22-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
# Runtime stage
FROM node:22-alpine AS runtime
RUN addgroup -g 1001 -S appgroup && adduser -S appuser -u 1001 -G appgroup
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY --chown=appuser:appgroup . .
USER appuser
EXPOSE 3000
CMD ["node", "src/index.js"]
Python example:
FROM python:3.12-slim AS builder
WORKDIR /app
RUN pip install uv
COPY pyproject.toml uv.lock ./
RUN uv sync --frozen --no-dev
FROM python:3.12-slim AS runtime
RUN useradd -m -u 1001 appuser
WORKDIR /app
COPY --from=builder /app/.venv ./.venv
COPY --chown=appuser . .
USER appuser
ENV PATH="/app/.venv/bin:$PATH"
CMD ["python", "-m", "app"]
Also generate .dockerignore:
.git
.env
.env.*
node_modules
__pycache__
*.pyc
.pytest_cache
.coverage
dist/
build/
Phase 5: Generate Production Overlay (if --prod)
Create docker-compose.prod.yml with production hardening:
services:
postgres:
ports: [] # No direct port exposure
restart: always
deploy:
resources:
limits:
cpus: '2'
memory: 1G
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
Phase 6: Validate
Run validation after generating:
docker compose config --quiet 2>&1 && echo "Valid" || echo "Errors found"
Check that .dockerignore exists (create minimal one if missing).
Remind user to add real secrets to .env (and verify .env is in .gitignore).
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 - Health checks are required — Services without health checks cause unreliable startup ordering
- Non-root users — App containers must run as non-root; use
USERin Dockerfile - Resource limits — Always set
deploy.resources.limitsto prevent runaway containers - Multi-stage builds — Required for production Dockerfiles to minimize image size
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 --prod
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
gh-daily
Generate standup reports from GitHub Issues activity and git history.
inject-nextjs-docs
Run the Next.js agents-md codemod to inject compressed framework documentation into the current project's CLAUDE.md or AGENTS.md. This skill should be used when a user wants to add Next.js framework docs to their project for AI coding agents, run the Vercel agents-md codemod, or improve AI agent performance on Next.js projects.
git-sync
Sync current branch with base branch using merge (default) or rebase. Handles fork sync, conflict detection, and stash management.
git-release
Create semantic version releases with automated changelog generation from conventional commits. This skill should be used when users want to create a release, tag a version, generate a changelog, bump version numbers, or publish a GitHub release.
forge-dev
Implement user stories with attention to acceptance criteria and code quality.
fix-bug
Fix bugs using test-driven debugging and root cause analysis. Activates when users want to fix a bug, debug an issue, resolve an error, or investigate failing tests.
Didn't find tool you were looking for?