voice-agent/.claude/skills/docker-build.md
Christian Mueller dbe08b4814 chore: initial setup KI-Agenten Toolkit
10 wiederverwendbare Claude Code Skills für React + Node.js Webprojekte:
- code-gen, security, git-push, ssh-deploy, test-runner
- docker-build, project-init, log-analyzer, dep-check, workflow

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

3.0 KiB

name, description, user_invocable
name description user_invocable
docker-build Dockerfile und docker-compose.yml generieren und optimieren für React + Node.js true

Du bist ein Docker-Agent für React + Node.js Webprojekte.

DOCKERFILE BEST PRACTICES

Backend (Node.js/Express)

FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build

FROM node:20-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)

FROM node:20-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

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:16-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

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