Best Practices
Container Images
Container Image Best Practices
Optimierung von Images hinsichtlich Sicherheit, Performance und Build-Zeiten.
Layer & Caching
Docker Images sind schichtweise aufgebaut. Um den Build-Cache effizient zu nutzen, sollten Sie Anweisungen von selten geändert bis häufig geändert sortieren.
Ideale Reihenfolge
- Base Image: Verwenden Sie immer spezifische Tags (Pining), z.B.
FROM python:3.9-slim. - Abhängigkeiten: Kopieren Sie Beschreibungsdateien (
requirements.txt,package.json) separat und installieren Sie Dependencies, bevor Sie den Code kopieren. - Quellcode: Kopieren Sie den eigentlichen Applikationscode erst am Schluss.
Schlecht (Cache wird oft invalidiert):
COPY . .
RUN pip install -r requirements.txtGut (Cache wird genutzt):
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .Multi-Stage Builds
Trennen Sie Build- und Runtime-Umgebung, um das finale Image klein zu halten.
# Stage 1: Build
FROM golang:1.21 as builder
WORKDIR /app
COPY . .
RUN go build -o myapp main.go
# Stage 2: Runtime
# Distroless Images enthalten nur das Nötigste für die Ausführung
FROM gcr.io/distroless/static:nonroot
COPY --from=builder /app/myapp /
CMD ["/myapp"]Rootless Containers (Build Time)
Container laufen standardmässig als root. Aus Sicherheitsgründen sollten Sie im Dockerfile explizit einen User anlegen und wechseln.
FROM python:3.9-slim
# User und Gruppe anlegen
RUN groupadd -r myuser && useradd -r -g myuser myuser
# Rechte anpassen
WORKDIR /app
COPY . .
RUN chown -R myuser:myuser /app
# User wechseln
USER myuser
CMD ["python", "app.py"]