voice-agent/.claude/skills/docker-build.md
Christian Mueller acceefe99b chore: upgrade to Debian 13 (Trixie), Node.js 22 LTS, PostgreSQL 17
- LXC templates: debian-13-standard (default)
- Docker images: node:22-alpine, postgres:17-alpine
- TypeScript target: ES2022
- Updated template references (Ubuntu 24.04, Alpine 3.20)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 22:01:28 +01:00

134 lines
3.0 KiB
Markdown

---
name: docker-build
description: Dockerfile und docker-compose.yml generieren und optimieren für React + Node.js
user_invocable: true
---
Du bist ein Docker-Agent für React + Node.js Webprojekte.
## DOCKERFILE BEST PRACTICES
### Backend (Node.js/Express)
```dockerfile
FROM node:22-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
FROM node:22-alpine
WORKDIR /app
RUN addgroup -g 1001 appgroup && adduser -u 1001 -G appgroup -s /bin/sh -D appuser
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
USER appuser
EXPOSE 4000
HEALTHCHECK --interval=30s --timeout=3s CMD wget -qO- http://localhost:4000/health || exit 1
CMD ["node", "dist/index.js"]
```
### Frontend (React)
```dockerfile
FROM node:22-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
HEALTHCHECK --interval=30s --timeout=3s CMD wget -qO- http://localhost/ || exit 1
```
## DOCKER-COMPOSE TEMPLATE
```yaml
version: '3.8'
services:
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
ports:
- "${FRONTEND_PORT:-3000}:80"
depends_on:
backend:
condition: service_healthy
restart: unless-stopped
backend:
build:
context: ./backend
dockerfile: Dockerfile
ports:
- "${BACKEND_PORT:-4000}:4000"
env_file:
- .env
depends_on:
db:
condition: service_healthy
restart: unless-stopped
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost:4000/health"]
interval: 30s
timeout: 3s
retries: 3
db:
image: postgres:17-alpine
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_DB: ${DB_NAME:-myapp}
POSTGRES_USER: ${DB_USER:-app}
POSTGRES_PASSWORD: ${DB_PASSWORD}
ports:
- "${DB_PORT:-5432}:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-app}"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
volumes:
pgdata:
```
## REGELN
- Multi-Stage Builds für kleinere Images
- Non-root User im Container
- Healthchecks immer definieren
- `.dockerignore` erstellen (node_modules, .git, .env, logs)
- Secrets NIEMALS im Image - nur via env_file oder Docker Secrets
- Alpine-basierte Images bevorzugen
- `npm ci` statt `npm install` im Build
- Layer-Caching optimieren (package.json vor Source kopieren)
## .DOCKERIGNORE
```
node_modules
.git
.env
*.log
dist
.DS_Store
coverage
.nyc_output
```
## NÜTZLICHE BEFEHLE
```bash
docker compose up -d --build # Build und Start
docker compose logs -f # Logs folgen
docker compose ps # Status
docker compose down # Stop und Remove
docker compose exec backend sh # Shell im Container
docker system prune -f # Cleanup
```