DevOps Fortgeschritten
Docker Multi-stage Builds¶
DockerContainerizationOptimierung 6 Min. Lesezeit
Optimierung von Docker-Images mit Multi-Stage Builds. Kleinere Images, schnellere Deploys, sicherere Container.
Warum Multi-stage¶
Ein klassisches Dockerfile enthält Build-Tools auch im Produktions-Image. Multi-Stage Builds trennen die Build- und Runtime-Phase.
- Kleineres finales Image (100 MB vs 1 GB)
- Keine Build-Tools in der Produktion
- Schnellerer Pull und Deploy
- Kleinere Angriffsfläche
Beispiel: Go-Anwendung¶
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /app/server ./cmd/server
FROM gcr.io/distroless/static-debian12:nonroot
COPY --from=builder /app/server /server
USER nonroot:nonroot
EXPOSE 8080
ENTRYPOINT ["/server"]
Resultierendes Image: ~10 MB statt ~800 MB mit vollem Go SDK.
Beispiel: Node.js¶
FROM node:20-alpine AS deps
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:20-alpine
WORKDIR /app
RUN addgroup -g 1001 -S nodejs && adduser -S nextjs -u 1001
COPY --from=deps /app/node_modules ./node_modules
COPY --from=build /app/dist ./dist
USER nextjs
EXPOSE 3000
CMD ["node", "dist/main.js"]
Best Practices¶
- Verwenden Sie
.dockerignore— schließen Sie node_modules, .git, docs aus - Ordnen Sie COPY-Befehle von selten zu häufig geänderten Dateien
- Verwenden Sie
--mount=type=cachefür Build-Abhängigkeits-Caching - Pinnen Sie Base-Image-Versionen (nicht
:latest) - Scannen Sie das finale Image:
trivy image myapp:latest
Zusammenfassung¶
Multi-Stage Builds sind die Grundlage moderner Containerisierung. Die Trennung von Build- und Runtime-Phase reduziert die Image-Größe drastisch und verbessert die Sicherheit.
Brauchen Sie Hilfe bei der Implementierung?¶
Unser Team hat Erfahrung mit dem Entwurf und der Implementierung moderner Architekturen. Wir helfen Ihnen gerne.