- 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>
134 lines
3.0 KiB
Markdown
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
|
|
```
|