Dockerfile erstellen
Dockerfile erstellen für Node.js, Python, Go oder statische Websites: mit Multi-Stage-Build, Nicht-Root-Benutzer, Healthcheck und passender .dockerignore.
Alles läuft in Ihrem Browser. Eingaben verlassen Ihr Gerät nicht.
Kleine, sichere Images
Mit dem Generator können Sie ein Dockerfile erstellen, das gängigen Empfehlungen folgt, statt mit einem Dreizeiler zu beginnen. Er deckt vier Fälle ab: ein Dockerfile für Node.js, ein Dockerfile für Python, kompilierte Go-Programme und statische Websites, die nginx ausliefert. Für jeden Fall entsteht zusätzlich eine passende .dockerignore, damit node_modules, virtuelle Umgebungen, .git und .env-Dateien nicht im Build-Kontext und schlimmstenfalls im Image landen.
Der Multi-Stage-Build trennt Bauen und Ausführen: In der ersten Stufe werden Abhängigkeiten installiert und der Code kompiliert, in die letzte Stufe kopiert COPY --from=… nur das Ergebnis. Compiler, Build-Werkzeuge und Entwicklungsabhängigkeiten bleiben draußen; ein Go-Programm passt so in ein Image von wenigen Megabyte. Ebenso wichtig ist der Nicht-Root-Benutzer: Das Node-Image bringt den Nutzer node mit, für Python legt der Generator einen eigenen an, distroless bietet die Variante :nonroot und für nginx wird nginxinc/nginx-unprivileged verwendet, das auf Port 8080 statt 80 lauscht.
Was Sie selbst prüfen sollten: die Versionsnummer des Basis-Images (am besten eine feste Haupt- oder Nebenversion), den Startbefehl und ob Ihre Anwendung auf 0.0.0.0 statt nur auf localhost lauscht, sonst ist sie von außen nicht erreichbar. Der Healthcheck nutzt Werkzeuge, die im jeweiligen Image vorhanden sind (wget unter Alpine, Python selbst im Python-Image); distroless und scratch enthalten keine Shell, dort entfällt er. Aus einem fertigen docker run-Befehl macht docker run in Compose umwandeln eine Compose-Datei.
Anleitung: Dockerfile erstellen in 4 Schritten
- Unter „Anwendung“ Node.js, Python, Go oder eine statische Website wählen.
- „Version“, „Port“ und den „Startbefehl“ anpassen; bei Bedarf einen „Build-Befehl“ und das Ausgabeverzeichnis eintragen.
- Die Schalter „Multi-Stage-Build“, „Als Nicht-Root-Benutzer ausführen“ und „Healthcheck“ setzen.
- Dockerfile und
.dockerignorekopieren, ins Projekt legen und mitdocker build -t meine-app .bauen.
Typische Anwendungsfälle
- Ein bestehendes Projekt erstmals in einen Container packen, mit sinnvollen Standards statt eines Minimalbeispiels.
- Images verkleinern: Mit dem Multi-Stage-Build Compiler, Quellcode und Entwicklungsabhängigkeiten aus dem fertigen Image heraushalten.
- Sicherheitsprüfungen bestehen: Scanner und Kubernetes-Richtlinien verlangen oft Container, die nicht als root laufen.
Häufige Fragen
Was ist ein Multi-Stage-Build?
Ein Dockerfile mit mehreren FROM-Zeilen. Jede beginnt eine neue Stufe; die letzte bildet das Image. Mit COPY --from=build werden nur die fertigen Dateien übernommen, Build-Werkzeuge bleiben zurück.
Warum soll der Container nicht als root laufen?
Gelingt einem Angreifer der Ausbruch aus der Anwendung, hat er im Container sonst volle Rechte und bei Fehlkonfigurationen auch mehr Möglichkeiten auf dem Host. Viele Kubernetes-Richtlinien lassen root-Container gar nicht erst zu.
Warum npm ci statt npm install?
npm ci installiert exakt die Versionen aus der package-lock.json, löscht vorher node_modules und bricht ab, wenn Lockfile und package.json nicht zusammenpassen. Das macht Builds reproduzierbar.
Wie baue und starte ich das Image?
Mit docker build -t meine-app . im Projektordner und danach docker run --rm -p 3000:3000 meine-app. Der erste Port ist der auf Ihrem Rechner, der zweite der im Container.
Alpine oder slim, welches Basis-Image ist besser?
Alpine ist sehr klein, verwendet aber musl statt glibc; manche Python-Pakete mit nativen Erweiterungen müssen dort aufwendig kompiliert werden. Für Python nimmt der Generator deshalb slim (Debian), für Node.js und Go Alpine.
Warum wird package.json vor dem restlichen Code kopiert?
Wegen des Layer-Caches. Solange sich package.json und package-lock.json nicht ändern, verwendet Docker die Schicht mit npm ci wieder und installiert die Abhängigkeiten nicht bei jeder Codeänderung neu.
Welche Basis-Images verwendet der Generator?
Die offiziellen Images node, python und golang aus Docker Hub, für Go zur Laufzeit wahlweise distroless, Alpine oder scratch, für statische Seiten nginx oder nginxinc/nginx-unprivileged. Die Versionsnummer tragen Sie selbst ein.
Das könnte auch helfen
Cron-Ausdruck erklären
Crontab-Zeilen mit 5 oder 6 Feldern auf Deutsch erklärt, mit den nächsten 10 Ausführungen.
ÖffnenCron-Generator
Zeitplan im Formular wählen und die fertige Crontab-Zeile kopieren.
ÖffnenUnix-Zeitstempel umrechnen
Timestamp in Datum und zurück, Sekunden und Millisekunden erkannt, UTC und Berlin.
ÖffnenUUID-Generator
UUID v4 und v7 erzeugen, bis zu 1.000 auf einmal, und vorhandene UUIDs prüfen.
ÖffnenULID-Generator
Sortierbare IDs in Crockford Base32 erzeugen, dekodieren und in UUID umwandeln.
ÖffnenTexte vergleichen (Diff)
Unterschiede zwischen zwei Texten zeilen-, wort- oder zeichenweise finden.
Öffnen