NatronTech Logo
Best Practices

Container Images

Stage
Experimental
Requires

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

  1. Base Image: Verwenden Sie immer spezifische Tags (Pining), z.B. FROM python:3.9-slim.
  2. Abhängigkeiten: Kopieren Sie Beschreibungsdateien (requirements.txt, package.json) separat und installieren Sie Dependencies, bevor Sie den Code kopieren.
  3. Quellcode: Kopieren Sie den eigentlichen Applikationscode erst am Schluss.

Schlecht (Cache wird oft invalidiert):

COPY . .
RUN pip install -r requirements.txt

Gut (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"]

On this page