Docker Development
Smaller images. Faster builds. Secure containers. No guesswork.
Opinionated Docker workflow that turns bloated Dockerfiles into production-grade containers. Covers optimization, multi-stage builds, compose orchestration, and security hardening.
Not a Docker tutorial — a set of concrete decisions about how to build containers that don't waste time, space, or attack surface.
Slash Commands
| Command |
What it does |
/docker:optimize |
Analyze and optimize a Dockerfile for size, speed, and layer caching |
/docker:compose |
Generate or improve docker-compose.yml with best practices |
/docker:security |
Audit a Dockerfile or running container for security issues |
When This Skill Activates
Recognize these patterns from the user:
- "Optimize this Dockerfile"
- "My Docker build is slow"
- "Create a docker-compose for this project"
- "Is this Dockerfile secure?"
- "Reduce my Docker image size"
- "Set up multi-stage builds"
- "Docker best practices for [language/framework]"
- Any request involving: Dockerfile, docker-compose, container, image size, build cache, Docker security
If the user has a Dockerfile or wants to containerize something → this skill applies.
Workflow
/docker:optimize — Dockerfile Optimization
Analyze current state
- Read the Dockerfile
- Identify base image and its size
- Count layers (each RUN/COPY/ADD = 1 layer)
- Check for common anti-patterns
Apply optimization checklist
BASE IMAGE
├── Use specific tags, never :latest in production
├── Prefer slim/alpine variants (debian-slim > ubuntu > debian)
├── Pin digest for reproducibility in CI: image@sha256:...
└── Match base to runtime needs (don't use python:3.12 for a compiled binary)
LAYER OPTIMIZATION
├── Combine related RUN commands with && \
├── Order layers: least-changing first (deps before source code)
├── Clean package manager cache in the same RUN layer
├── Use .dockerignore to exclude unnecessary files
└── Separate build deps from runtime deps
BUILD CACHE
├── COPY dependency files before source code (package.json, requirements.txt, go.mod)
├── Install deps in a separate layer from code copy
├── Use BuildKit cache mounts: --mount=type=cache,target=/root/.cache
└── Avoid COPY . . before dependency installation
MULTI-STAGE BUILDS
├── Stage 1: build (full SDK, build tools, dev deps)
├── Stage 2: runtime (minimal base, only production artifacts)
├── COPY --from=builder only what's needed
└── Final image should have NO build tools, NO source code, NO dev deps
Generate optimized Dockerfile
- Apply all relevant optimizations
- Add inline comments explaining each decision
- Report estimated size reduction
Validate
python3 scripts/dockerfile_analyzer.py Dockerfile
/docker:compose — Docker Compose Configuration
Identify services
- Application (web, API, worker)
- Database (postgres, mysql, redis, mongo)
- Cache (redis, memcached)
- Queue (rabbitmq, kafka)
- Reverse proxy (nginx, traefik, caddy)
Apply compose best practices
SERVICES
├── Use depends_on with condition: service_healthy
├── Add healthchecks for every service
├── Set resource limits (mem_limit, cpus)
├── Use named volumes for persistent data
└── Pin image versions
NETWORKING
├── Create explicit networks (don't rely on default)
├── Separate frontend and backend networks
├── Only expose ports that need external access
└── Use internal: true for backend-only networks
ENVIRONMENT
├── Use env_file for secrets, not inline environment
├── Never commit .env files (add to .gitignore)
├── Use variable substitution: ${VAR:-default}
└── Document all required env vars
DEVELOPMENT vs PRODUCTION
├── Use compose profiles or override files
├── Dev: bind mounts for hot reload, debug ports exposed
├── Prod: named volumes, no debug ports, restart: unless-stopped
└── docker-compose.override.yml for dev-only config
Generate compose file
- Output docker-compose.yml with healthchecks, networks, volumes
- Generate .env.example with all required variables documented
- Add dev/prod profile annotations
/docker:security — Container Security Audit
Dockerfile audit
| Check |
Severity |
Fix |
| Running as root |
Critical |
Add USER nonroot after creating user |
| Using :latest tag |
High |
Pin to specific version |
| Secrets in ENV/ARG |
Critical |
Use BuildKit secrets: --mount=type=secret |
| COPY with broad glob |
Medium |
Use specific paths, add .dockerignore |
| Unnecessary EXPOSE |
Low |
Only expose ports the app uses |
| No HEALTHCHECK |
Medium |
Add HEALTHCHECK with appropriate interval |
| Privileged instructions |
High |
Avoid --privileged, drop capabilities |
| Package manager cache retained |
Low |
Clean in same RUN layer |
Runtime security checks
| Check |
Severity |
Fix |
| Container running as root |
Critical |
Set user in Dockerfile or compose |
| Writable root filesystem |
Medium |
Use read_only: true in compose |
| All capabilities retained |
High |
Drop all, add only needed: cap_drop: [ALL] |
| No resource limits |
Medium |
Set mem_limit and cpus |
| Host network mode |
High |
Use bridge or custom network |
| Sensitive mounts |
Critical |
Never mount /etc, /var/run/docker.sock in prod |
| No log driver configured |
Low |
Set logging: with size limits |
Generate security report
SECURITY AUDIT — [Dockerfile/Image name]
Date: [timestamp]
CRITICAL: [count]
HIGH: [count]
MEDIUM: [count]
LOW: [count]
[Detailed findings with fix recommendations]
Tooling
scripts/dockerfile_analyzer.py
CLI utility for static analysis of Dockerfiles.
Features:
- Layer count and optimization suggestions
- Base image analysis with size estimates
- Anti-pattern detection (15+ rules)
- Security issue flagging
- Multi-stage build detection and validation
- JSON and text output
Usage:
# Analyze a Dockerfile
python3 scripts/dockerfile_analyzer.py Dockerfile
# JSON output
python3 scripts/dockerfile_analyzer.py Dockerfile --output json
# Analyze with security focus
python3 scripts/dockerfile_analyzer.py Dockerfile --security
# Check a specific directory
python3 scripts/dockerfile_analyzer.py path/to/Dockerfile
scripts/compose_validator.py
CLI utility for validating docker-compose files.
Features:
- Service dependency validation
- Healthcheck presence detection
- Network configuration analysis
- Volume mount validation
- Environment variable audit
- Port conflict detection
- Best practice scoring
Usage:
# Validate a compose file
python3 scripts/compose_validator.py docker-compose.yml
# JSON output
python3 scripts/compose_validator.py docker-compose.yml --output json
# Strict mode (fail on warnings)
python3 scripts/compose_validator.py docker-compose.yml --strict
Multi-Stage Build Patterns
Pattern 1: Compiled Language (Go, Rust, C++)
# Build stage
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o /app/server ./cmd/server
# Runtime stage
FROM gcr.io/distroless/static-debian12
COPY --from=builder /app/server /server
USER nonroot:nonroot
ENTRYPOINT ["/server"]
Pattern 2: Node.js / TypeScript
# Dependencies stage
FROM node:20-alpine AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --production=false
# Build stage
FROM deps AS builder
COPY . .
RUN npm run build
# Runtime stage
FROM node:20-alpine
WORKDIR /app
RUN addgroup -g 1001 -S appgroup && adduser -S appuser -u 1001
COPY --from=builder /app/dist ./dist
COPY --from=deps /app/node_modules ./node_modules
COPY package.json ./
USER appuser
EXPOSE 3000
CMD ["node", "dist/index.js"]
Pattern 3: Python
# Build stage
FROM python:3.12-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir --prefix=/install -r requirements.txt
# Runtime stage
FROM python:3.12-slim
WORKDIR /app
RUN groupadd -r appgroup && useradd -r -g appgroup appuser
COPY --from=builder /install /usr/local
COPY . .
USER appuser
EXPOSE 8000
CMD ["python", "-m", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
Base Image Decision Tree
Is it a compiled binary (Go, Rust, C)?
├── Yes → distroless/static or scratch
└── No
├── Need a shell for debugging?
│ ├── Yes → alpine variant (e.g., node:20-alpine)
│ └── No → distroless variant
├── Need glibc (not musl)?
│ ├── Yes → slim variant (e.g., python:3.12-slim)
│ └── No → alpine variant
└── Need specific OS packages?
├── Many → debian-slim
└── Few → alpine + apk add
Proactive Triggers
Flag these without being asked:
- Dockerfile uses :latest → Suggest pinning to a specific version tag.
- No .dockerignore → Create one. At minimum:
.git, node_modules, __pycache__, .env.
- COPY . . before dependency install → Cache bust. Reorder to install deps first.
- Running as root → Add USER instruction. No exceptions for production.
- Secrets in ENV or ARG → Use BuildKit secret mounts. Never bake secrets into layers.
- Image over 1GB → Multi-stage build required. No reason for a production image this large.
- No healthcheck → Add one. Orchestrators (Compose, K8s) need it for proper lifecycle management.
- apt-get without cleanup in same layer →
rm -rf /var/lib/apt/lists/* in the same RUN.
Installation
One-liner (any tool)
git clone https://github.com/alirezarezvani/claude-skills.git
cp -r claude-skills/engineering/docker-development ~/.claude/skills/
Multi-tool install
./scripts/convert.sh --skill docker-development --tool codex|gemini|cursor|windsurf|openclaw
OpenClaw
clawhub install cs-docker-development
Related Skills
- senior-devops — Broader DevOps scope (CI/CD, IaC, monitoring). Complementary — use docker-development for container-specific work, senior-devops for pipeline and infrastructure.
- senior-security — Application security. Complementary — docker-development covers container security, senior-security covers application-level threats.
- autoresearch-agent — Can optimize Docker build times or image sizes as measurable experiments.
- ci-cd-pipeline-builder — Pipeline construction. Complementary — docker-development builds the containers, ci-cd-pipeline-builder deploys them.
Source: alirezarezvani/claude-skills → engineering/docker-development/skills/docker-development/SKILL.md
1---2name: docker-development3description: Docker and container development agent skill and plugin for Dockerfile optimization, docker-compose orchestration, multi-stage builds, and container security hardening. Use when: user wants to optimize a Dockerfile, create or improve docker-compose configurations, implement multi-stage builds, audit container security, reduce image size, or follow container best practices. Covers build performance, layer caching, secret management, and production-ready container patterns.4---5
6
7# Docker Development
8
9> Smaller images. Faster builds. Secure containers. No guesswork.
10
11Opinionated Docker workflow that turns bloated Dockerfiles into production-grade containers. Covers optimization, multi-stage builds, compose orchestration, and security hardening.
12
13Not a Docker tutorial — a set of concrete decisions about how to build containers that don't waste time, space, or attack surface.
14
15---
16
17## Slash Commands
18
19| Command | What it does |
20|---------|-------------|
21| `/docker:optimize` | Analyze and optimize a Dockerfile for size, speed, and layer caching |
22| `/docker:compose` | Generate or improve docker-compose.yml with best practices |
23| `/docker:security` | Audit a Dockerfile or running container for security issues |
24
25---
26
27## When This Skill Activates
28
29Recognize these patterns from the user:
30
31- "Optimize this Dockerfile"
32- "My Docker build is slow"
33- "Create a docker-compose for this project"
34- "Is this Dockerfile secure?"
35- "Reduce my Docker image size"
36- "Set up multi-stage builds"
37- "Docker best practices for [language/framework]"
38- Any request involving: Dockerfile, docker-compose, container, image size, build cache, Docker security
39
40If the user has a Dockerfile or wants to containerize something → this skill applies.
41
42---
43
44## Workflow
45
46### `/docker:optimize` — Dockerfile Optimization
47
481. **Analyze current state**
49 - Read the Dockerfile
50 - Identify base image and its size
51 - Count layers (each RUN/COPY/ADD = 1 layer)
52 - Check for common anti-patterns
53
542. **Apply optimization checklist**
55
56 ```
57 BASE IMAGE
58 ├── Use specific tags, never :latest in production
59 ├── Prefer slim/alpine variants (debian-slim > ubuntu > debian)
60 ├── Pin digest for reproducibility in CI: image@sha256:...
61 └── Match base to runtime needs (don't use python:3.12 for a compiled binary)
62
63 LAYER OPTIMIZATION
64 ├── Combine related RUN commands with && \
65 ├── Order layers: least-changing first (deps before source code)
66 ├── Clean package manager cache in the same RUN layer
67 ├── Use .dockerignore to exclude unnecessary files
68 └── Separate build deps from runtime deps
69
70 BUILD CACHE
71 ├── COPY dependency files before source code (package.json, requirements.txt, go.mod)
72 ├── Install deps in a separate layer from code copy
73 ├── Use BuildKit cache mounts: --mount=type=cache,target=/root/.cache
74 └── Avoid COPY . . before dependency installation
75
76 MULTI-STAGE BUILDS
77 ├── Stage 1: build (full SDK, build tools, dev deps)
78 ├── Stage 2: runtime (minimal base, only production artifacts)
79 ├── COPY --from=builder only what's needed
80 └── Final image should have NO build tools, NO source code, NO dev deps
81 ```
82
833. **Generate optimized Dockerfile**
84 - Apply all relevant optimizations
85 - Add inline comments explaining each decision
86 - Report estimated size reduction
87
884. **Validate**
89 ```bash
90 python3 scripts/dockerfile_analyzer.py Dockerfile
91 ```
92
93### `/docker:compose` — Docker Compose Configuration
94
951. **Identify services**
96 - Application (web, API, worker)
97 - Database (postgres, mysql, redis, mongo)
98 - Cache (redis, memcached)
99 - Queue (rabbitmq, kafka)
100 - Reverse proxy (nginx, traefik, caddy)
101
1022. **Apply compose best practices**
103
104 ```
105 SERVICES
106 ├── Use depends_on with condition: service_healthy
107 ├── Add healthchecks for every service
108 ├── Set resource limits (mem_limit, cpus)
109 ├── Use named volumes for persistent data
110 └── Pin image versions
111
112 NETWORKING
113 ├── Create explicit networks (don't rely on default)
114 ├── Separate frontend and backend networks
115 ├── Only expose ports that need external access
116 └── Use internal: true for backend-only networks
117
118 ENVIRONMENT
119 ├── Use env_file for secrets, not inline environment
120 ├── Never commit .env files (add to .gitignore)
121 ├── Use variable substitution: ${VAR:-default}
122 └── Document all required env vars
123
124 DEVELOPMENT vs PRODUCTION
125 ├── Use compose profiles or override files
126 ├── Dev: bind mounts for hot reload, debug ports exposed
127 ├── Prod: named volumes, no debug ports, restart: unless-stopped
128 └── docker-compose.override.yml for dev-only config
129 ```
130
1313. **Generate compose file**
132 - Output docker-compose.yml with healthchecks, networks, volumes
133 - Generate .env.example with all required variables documented
134 - Add dev/prod profile annotations
135
136### `/docker:security` — Container Security Audit
137
1381. **Dockerfile audit**
139
140 | Check | Severity | Fix |
141 |-------|----------|-----|
142 | Running as root | Critical | Add `USER nonroot` after creating user |
143 | Using :latest tag | High | Pin to specific version |
144 | Secrets in ENV/ARG | Critical | Use BuildKit secrets: `--mount=type=secret` |
145 | COPY with broad glob | Medium | Use specific paths, add .dockerignore |
146 | Unnecessary EXPOSE | Low | Only expose ports the app uses |
147 | No HEALTHCHECK | Medium | Add HEALTHCHECK with appropriate interval |
148 | Privileged instructions | High | Avoid `--privileged`, drop capabilities |
149 | Package manager cache retained | Low | Clean in same RUN layer |
150
1512. **Runtime security checks**
152
153 | Check | Severity | Fix |
154 |-------|----------|-----|
155 | Container running as root | Critical | Set user in Dockerfile or compose |
156 | Writable root filesystem | Medium | Use `read_only: true` in compose |
157 | All capabilities retained | High | Drop all, add only needed: `cap_drop: [ALL]` |
158 | No resource limits | Medium | Set `mem_limit` and `cpus` |
159 | Host network mode | High | Use bridge or custom network |
160 | Sensitive mounts | Critical | Never mount /etc, /var/run/docker.sock in prod |
161 | No log driver configured | Low | Set `logging:` with size limits |
162
1633. **Generate security report**
164 ```
165 SECURITY AUDIT — [Dockerfile/Image name]
166 Date: [timestamp]
167
168 CRITICAL: [count]
169 HIGH: [count]
170 MEDIUM: [count]
171 LOW: [count]
172
173 [Detailed findings with fix recommendations]
174 ```
175
176---
177
178## Tooling
179
180### `scripts/dockerfile_analyzer.py`
181
182CLI utility for static analysis of Dockerfiles.
183
184**Features:**
185- Layer count and optimization suggestions
186- Base image analysis with size estimates
187- Anti-pattern detection (15+ rules)
188- Security issue flagging
189- Multi-stage build detection and validation
190- JSON and text output
191
192**Usage:**
193```bash
194# Analyze a Dockerfile
195python3 scripts/dockerfile_analyzer.py Dockerfile
196
197# JSON output
198python3 scripts/dockerfile_analyzer.py Dockerfile --output json
199
200# Analyze with security focus
201python3 scripts/dockerfile_analyzer.py Dockerfile --security
202
203# Check a specific directory
204python3 scripts/dockerfile_analyzer.py path/to/Dockerfile
205```
206
207### `scripts/compose_validator.py`
208
209CLI utility for validating docker-compose files.
210
211**Features:**
212- Service dependency validation
213- Healthcheck presence detection
214- Network configuration analysis
215- Volume mount validation
216- Environment variable audit
217- Port conflict detection
218- Best practice scoring
219
220**Usage:**
221```bash
222# Validate a compose file
223python3 scripts/compose_validator.py docker-compose.yml
224
225# JSON output
226python3 scripts/compose_validator.py docker-compose.yml --output json
227
228# Strict mode (fail on warnings)
229python3 scripts/compose_validator.py docker-compose.yml --strict
230```
231
232---
233
234## Multi-Stage Build Patterns
235
236### Pattern 1: Compiled Language (Go, Rust, C++)
237
238```dockerfile
239# Build stage
240FROM golang:1.22-alpine AS builder
241WORKDIR /app
242COPY go.mod go.sum ./
243RUN go mod download
244COPY . .
245RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o /app/server ./cmd/server
246
247# Runtime stage
248FROM gcr.io/distroless/static-debian12
249COPY --from=builder /app/server /server
250USER nonroot:nonroot
251ENTRYPOINT ["/server"]
252```
253
254### Pattern 2: Node.js / TypeScript
255
256```dockerfile
257# Dependencies stage
258FROM node:20-alpine AS deps
259WORKDIR /app
260COPY package.json package-lock.json ./
261RUN npm ci --production=false
262
263# Build stage
264FROM deps AS builder
265COPY . .
266RUN npm run build
267
268# Runtime stage
269FROM node:20-alpine
270WORKDIR /app
271RUN addgroup -g 1001 -S appgroup && adduser -S appuser -u 1001
272COPY --from=builder /app/dist ./dist
273COPY --from=deps /app/node_modules ./node_modules
274COPY package.json ./
275USER appuser
276EXPOSE 3000
277CMD ["node", "dist/index.js"]
278```
279
280### Pattern 3: Python
281
282```dockerfile
283# Build stage
284FROM python:3.12-slim AS builder
285WORKDIR /app
286COPY requirements.txt .
287RUN pip install --no-cache-dir --prefix=/install -r requirements.txt
288
289# Runtime stage
290FROM python:3.12-slim
291WORKDIR /app
292RUN groupadd -r appgroup && useradd -r -g appgroup appuser
293COPY --from=builder /install /usr/local
294COPY . .
295USER appuser
296EXPOSE 8000
297CMD ["python", "-m", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
298```
299
300---
301
302## Base Image Decision Tree
303
304```
305Is it a compiled binary (Go, Rust, C)?
306├── Yes → distroless/static or scratch
307└── No
308 ├── Need a shell for debugging?
309 │ ├── Yes → alpine variant (e.g., node:20-alpine)
310 │ └── No → distroless variant
311 ├── Need glibc (not musl)?
312 │ ├── Yes → slim variant (e.g., python:3.12-slim)
313 │ └── No → alpine variant
314 └── Need specific OS packages?
315 ├── Many → debian-slim
316 └── Few → alpine + apk add
317```
318
319---
320
321## Proactive Triggers
322
323Flag these without being asked:
324
325- **Dockerfile uses :latest** → Suggest pinning to a specific version tag.
326- **No .dockerignore** → Create one. At minimum: `.git`, `node_modules`, `__pycache__`, `.env`.
327- **COPY . . before dependency install** → Cache bust. Reorder to install deps first.
328- **Running as root** → Add USER instruction. No exceptions for production.
329- **Secrets in ENV or ARG** → Use BuildKit secret mounts. Never bake secrets into layers.
330- **Image over 1GB** → Multi-stage build required. No reason for a production image this large.
331- **No healthcheck** → Add one. Orchestrators (Compose, K8s) need it for proper lifecycle management.
332- **apt-get without cleanup in same layer** → `rm -rf /var/lib/apt/lists/*` in the same RUN.
333
334---
335
336## Installation
337
338### One-liner (any tool)
339```bash
340git clone https://github.com/alirezarezvani/claude-skills.git
341cp -r claude-skills/engineering/docker-development ~/.claude/skills/
342```
343
344### Multi-tool install
345```bash
346./scripts/convert.sh --skill docker-development --tool codex|gemini|cursor|windsurf|openclaw
347```
348
349### OpenClaw
350```bash
351clawhub install cs-docker-development
352```
353
354---
355
356## Related Skills
357
358- **senior-devops** — Broader DevOps scope (CI/CD, IaC, monitoring). Complementary — use docker-development for container-specific work, senior-devops for pipeline and infrastructure.
359- **senior-security** — Application security. Complementary — docker-development covers container security, senior-security covers application-level threats.
360- **autoresearch-agent** — Can optimize Docker build times or image sizes as measurable experiments.
361- **ci-cd-pipeline-builder** — Pipeline construction. Complementary — docker-development builds the containers, ci-cd-pipeline-builder deploys them.
362
363---
364
365**Source:** [`alirezarezvani/claude-skills`](https://github.com/alirezarezvani/claude-skills) → `engineering/docker-development/skills/docker-development/SKILL.md`