--- 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: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) ```dockerfile 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 ```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: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 ```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 ```