EMZETT.
Login

Dockerfile: Ein Container-Image bauen

Kurz: Ein Dockerfile ist eine Textdatei mit Schritten, aus denen Docker ein Image baut, also die Vorlage für Container.

Genauer: Ein Image enthält Programm, Laufzeit und Abhängigkeiten; aus ihm startet man Container. Das Dockerfile beschreibt, wie das Image entsteht, Befehl für Befehl. Jeder Befehl erzeugt eine Schicht (Layer), die zwischengespeichert wird, sodass ein erneuter Bau nur geänderte Schichten neu erstellt.

Im Detail

Beispiel für eine Node.js-App

FROM node:22-alpine           # Basis-Image
WORKDIR /app                  # Arbeitsverzeichnis
COPY package*.json ./         # zuerst nur Paketlisten
RUN npm ci --omit=dev         # Abhängigkeiten installieren
COPY . .                      # dann den Rest kopieren
EXPOSE 3000                   # Hinweis auf den Port
USER node                     # nicht als root laufen
CMD ["node", "server.js"]     # Startbefehl

Bauen und starten:

docker build -t meine-app:1.0 .
docker run -p 3000:3000 meine-app:1.0

Wichtige Anweisungen

  • FROM: Basis-Image (möglichst klein und mit fester Version).
  • RUN: Befehl beim Bau ausführen.
  • COPY / ADD: Dateien hineinkopieren (COPY bevorzugen).
  • ENV, ARG: Variablen.
  • CMD, ENTRYPOINT: Befehl beim Start des Containers.
  • HEALTHCHECK: prüft, ob die App läuft.

Gute Praxis

  • Reihenfolge nutzen: Selten Geändertes (Abhängigkeiten) zuerst, Quellcode zuletzt, damit der Cache greift.
  • .dockerignore wie .gitignore: node_modules, .git, Geheimnisse nicht ins Image.
  • Multi-Stage-Builds: In einer Stufe bauen, nur das Ergebnis in ein schlankes Endimage kopieren.
  • Nicht als root laufen, Basis-Image aktuell halten und auf Sicherheitslücken prüfen (docker scout, Trivy).
  • Keine Passwörter im Dockerfile: Sie bleiben in den Schichten sichtbar.

Multi-Stage-Beispiel

FROM golang:1.23 AS build
WORKDIR /src
COPY . .
RUN CGO_ENABLED=0 go build -o /app
 
FROM gcr.io/distroless/static
COPY --from=build /app /app
CMD ["/app"]

Das Endimage enthält nur das fertige Programm, nicht den Compiler, und ist dadurch klein und angriffsärmer.

Siehe auch: Docker, Container-Sicherheit, Podman und Docker, Umgebungsvariablen