From dev-team
Generates production-ready Dockerfiles by auto-detecting language, framework, and dependencies. Produces multi-stage builds with distroless or slim base images.
How this skill is triggered — by the user, by Claude, or both
Slash command
/dev-team:docker-image-createThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Generate production-ready Dockerfiles by analyzing language, framework, and dependencies. Output is a multi-stage build optimized for small image size, fast builds, and minimal attack surface.
Generate production-ready Dockerfiles by analyzing language, framework, and dependencies. Output is a multi-stage build optimized for small image size, fast builds, and minimal attack surface.
Default base image strategy: distroless when possible (only the app and its runtime — no shell, no package manager, no OS utilities; minimal CVE exposure). Fall back to slim (node:22-slim, python:3.12-slim) when the runtime needs OS-level libraries or a shell for debugging.
Scan the project root to identify:
Language + version (from version files / configs):
package.json (Node.js — engines.node)go.mod (Go — go directive)requirements.txt / pyproject.toml / Pipfile (Python — python_requires / .python-version)pom.xml / build.gradle{,kts} (Java/Kotlin — sourceCompatibility)*.csproj / *.fsproj (C#/F# — TargetFramework)mix.exs (Elixir), Gemfile (Ruby)Framework (drives build command + output structure):
Package manager (drives install command):
package-lock.json), yarn (yarn.lock), pnpm (pnpm-lock.yaml), bun (bun.lockb)requirements.txt), poetry (poetry.lock), pipenv (Pipfile.lock), uv (uv.lock)Entry point: package.json scripts.start / main, Procfile, existing Dockerfile CMD, or framework convention (main.go, app.py, Application.java).
Existing Docker artifacts: .dockerignore, existing Dockerfile, docker-compose.yml.
Present a detection summary to the user and ask: "Want me to adjust anything before generating?"
Ask:
FROM paths and login steps.DOCKER_BUILDKIT=1). Enables cache mounts, secret mounts, and parallel stages..dockerignore? If missing or sparse.docker-compose.yml? For local development.Proceed with sensible defaults if the user says "just go with defaults."
Layer order (least-changed → most-changed) for cache efficiency: base image → system deps → dependency manifest + install → source code → build → final stage with only the runtime artifact.
Cache-friendly install — copy manifests first, install, then copy source:
COPY package.json pnpm-lock.yaml ./
RUN pnpm install --frozen-lockfile
COPY . .
RUN pnpm build
Never COPY . . before install — busts the cache on every source change.
Stages: deps (install) → build (compile/bundle) → runtime (minimal base with artifact only). Two stages suffice for interpreted languages without a build step.
Base image table:
| Language | Build stage | Runtime stage |
|---|---|---|
| Go | golang:<version> | gcr.io/distroless/static-debian12 |
| Java | eclipse-temurin:<version> | gcr.io/distroless/java21-debian12 |
| Node.js | node:<version> | node:<version>-slim or gcr.io/distroless/nodejs22-debian12 |
| Python | python:<version> | python:<version>-slim |
| .NET | mcr.microsoft.com/dotnet/sdk:<version> | mcr.microsoft.com/dotnet/aspnet:<version>-alpine |
Pin major.minor (e.g., node:22.12, not node:latest). Digest-pin only for high-security environments.
Security defaults:
USER nonroot for distroless; create a user for slim bases).env, secrets, or credentials into the image--frozen-lockfile / --ci for reproducible installsNODE_ENV=production or equivalentCOPY --chown to set ownership without running as rootHealth checks (when the app exposes HTTP):
HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
CMD ["wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/health"] || exit 1
Distroless images lack wget/curl — skip HEALTHCHECK and rely on the orchestrator (Kubernetes liveness probes etc.).
OCI labels:
LABEL org.opencontainers.image.source="https://github.com/OWNER/REPO"
LABEL org.opencontainers.image.description="Brief description"
If absent or sparse, write one tailored to the detected language. Common patterns:
.git
.github
node_modules
dist
build
*.md
.env*
.vscode
.idea
Dockerfile*
docker-compose*
.dockerignore
coverage
.nyc_output
__pycache__
*.pyc
.pytest_cache
.mypy_cache
bin/
obj/
Drop language-irrelevant patterns (no Python patterns for a Go project).
Development-focused: volume mounts for live reload, port mappings, env-file references, dependent services (database, cache) if detected.
docker build -t my-app .
docker run -p 3000:3000 my-app
# With BuildKit
DOCKER_BUILDKIT=1 docker build -t my-app .
Include framework-specific notes (e.g., Next.js standalone mode requires output: 'standalone' in next.config.js).
--frozen-lockfile for reproducible installs.next/standalone + .next/static + public/NODE_ENV=production before the build step (for tree-shaking)node user (built-in to slim images)CGO_ENABLED=0 for fully static binaries (works with distroless/static)GOFLAGS="-trimpath" + -ldflags="-s -w"--no-cache-dir with pip (don't bake wheels into the image)--no-install-recommends for apt-getuv for faster installsmcr.microsoft.com/dotnet/sdk:<version>; runtime mcr.microsoft.com/dotnet/aspnet:<version>-alpineCOPY *.csproj ./ → dotnet restore → copy source → dotnet publishdotnet publish -c Release -o /app --no-restore (skip redundant restore)dotnet publish -c Release --self-contained -r linux-musl-x64 -p:PublishTrimmed=trueENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=true (saves ~30MB).csproj preserving structure, restore, copy everything, publish entry-point projectUSER app (built-in non-root in .NET 8+), ASPNETCORE_URLS=http://+:8080 (default for non-root)java -Djarmode=layertools -jar app.jar extract; copy dependencies, spring-boot-loader, snapshot-dependencies, application as separate layersjlink for custom minimal JRE-XX:+UseContainerSupport for correct memory detection in containersnpx claudepluginhub bdfinst/agentic-dev-team --plugin dev-teamGenerates optimized multi-stage Dockerfiles, .dockerignore, for Node.js, Python, Go, Java apps with security hardening, layer caching, validation, and error fixes.
Generates optimized Dockerfiles with multi-stage builds, non-root execution, layer caching, health checks, and .dockerignore. Activates when user wants to containerize an app, create a Docker image, or configure Docker Compose.
Scans your project to detect the stack and generates a production-ready Dockerfile with multi-stage builds, layer caching, and security hardening. Also creates .dockerignore and optional docker-compose.yml.