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"] # StartbefehlBauen 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 (COPYbevorzugen).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.
.dockerignorewie.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