Docker init: So initialisierst du ein Projekt mit Docker (Schritt-für-Schritt-Anleitung)
Ein praxisnaher Guide zu "docker init" – welche Dateien erzeugt werden, wie du es an einem echten Python-Projekt nutzt und wann es das richtige Tool ist.
Aus irgendeinem Grund dauert es immer länger als nötig, ein neues Projekt mit Docker aufzusetzen.
Du googelst ein Template, fügst es ein, änderst ein paar Zeilen und hoffst aufs Beste. Der Build schlägt fehl, also schraubst du nach und wiederholst das Spiel, bis es läuft. Jedes neue Projekt startet gleich – mit einer leeren Datei und der vagen Erinnerung daran, was letztes Mal funktioniert hat. Das ist eindeutig ein Setup-Problem, und Docker ist nicht schuld.
Die gute Nachricht: docker init behebt das. Der CLI-Befehl erkennt deinen Projekttyp und erzeugt ein Dockerfile, eine .dockerignore und eine Compose-Datei.
In diesem Artikel zeige ich dir, wie docker init funktioniert, wie du es Schritt für Schritt an einem echten Python-Projekt nutzt und wann es das richtige Werkzeug ist.
Bist du neu bei Docker und Containerisierung? Erfahre, warum es zum Werkzeugkasten von Datenprofis gehört – mit unserem Introduction to Docker Kurs.
Was ist Docker init
docker init ist ein CLI-Tool, das die Docker-Konfiguration für dein Projekt aufsetzt. Es erzeugt die Dateien, die du brauchst, um deine App zu containerisieren. Vorlagen oder Copy-Paste entfallen damit.
Es erstellt drei Dateien:
Dockerfile – definiert, wie dein Container-Image gebaut wird
.dockerignore – sagt Docker, welche Dateien aus dem Build-Kontext herauszuhalten sind
compose.yml – optional, aber praktisch für Multi-Service-Setups
Das Clevere ist die automatische Projekterkennung. docker init analysiert deine Struktur und erkennt deinen Stack – Python, Node.js, Go und weitere. Dann generiert es passende Dateien für diesen Stack statt eines generischen Templates.
Es ist kein Deployment-Tool und verwaltet keine Container in Produktion. Es bringt nur deine Konfiguration an den Start, damit du dich auf die eigentliche Arbeit konzentrieren kannst.
So funktioniert Docker init
docker init folgt bei jedem Lauf einem Ablauf in vier Schritten.
Zuerst führst du docker init im Projektordner aus. Docker scannt das Verzeichnis, erkennt den Projekttyp und wählt das passende Konfigurationstemplate. Danach führt dich ein kurzer interaktiver Dialog durch ein paar Fragen – etwa auf welchem Port deine App läuft und mit welchem Befehl sie startet. Sobald du antwortest, werden die Dateien erzeugt.
Das Ganze dauert weniger als eine Minute.
Die Eingaben sind einfach und selten erklärungsbedürftig. Du kannst die Standardwerte mit Enter übernehmen oder eigene Werte eintragen, wenn sie nicht passen.
So sieht der erste Start des Befehls aus:
Docker-init-Setup-Bildschirm
Ich zeige dir den Ablauf als Nächstes genauer.
Docker init Schritt für Schritt nutzen
So kommst du vom Projektordner zum laufenden Container.
Schritt 1: In dein Projektverzeichnis wechseln
Öffne dein Terminal und wechsle ins Projekt-Root – also den Ordner mit deinem Anwendungscode.
Docker scannt den Projektordner, erkennt deinen Stack und startet den interaktiven Setup-Dialog.
Schritt 3: Die Fragen beantworten
docker init stellt dir ein paar Fragen:
Anwendungsplattform – die Sprache bzw. das Framework deines Projekts (Python, Node.js, Go usw.)
Port – der Port, auf dem deine App lauscht
Startbefehl – der Befehl, den Docker zum Start deiner App ausführen soll
Du kannst die vorgeschlagenen Defaults mit Enter übernehmen oder eigene Werte eingeben. Wenn docker init deinen Stack erkennt, reichen die Defaults meist für den Start.
Schritt 4: Die erzeugten Dateien prüfen
Nach dem Dialog schreibt docker init drei Dateien in deinen Projektordner:
Öffne die Dateien und lies sie durch. Die generierten Dateien enthalten Kommentare, die jede Zeile erklären. Nimm dir kurz Zeit, das zu verstehen, bevor du weiterbaust.
Schritt 5: Container bauen und starten
Baue und starte deinen Container mit Docker Compose:
Der Schalter --build weist Docker an, das Image aus deinem Dockerfile zu bauen, bevor der Container startet. Läuft er, ist deine App über den in Schritt 3 angegebenen Port erreichbar.
Unterstützte Projekttypen in Docker init
docker init unterstützt out of the box die gängigsten Stacks. Hier ein paar Beispiele:
Python
Node.js
Go
Java
.NET
Die Erkennung läuft automatisch. Wenn du docker init startest, scannt es deinen Ordner nach sprachspezifischen Dateien – etwa requirements.txt für Python oder package.json für Node.js – und wählt auf dieser Basis das passende Template.
Jedes Template ist auf den Stack zugeschnitten. Ein Python-Projekt bekommt ein anderes Base-Image, andere Installationsschritte und Startbefehle als ein Go-Projekt. Es ist kein One-Size-Fits-All-Dockerfile mit einer ausgetauschten Sprachvariable – die Struktur ändert sich je nach Anwendung.
Wenn docker init deinen Stack nicht erkennt, kannst du ihn im Dialog manuell auswählen.
Von Docker init erzeugte Dateien
docker init erzeugt drei Dateien, die jeweils eine andere Rolle im Setup haben.
Dockerfile
Das Dockerfile definiert, wie Docker dein Container-Image baut. Es legt fest, von welchem Base-Image gestartet wird, wie Abhängigkeiten installiert werden und welcher Befehl beim Containerstart ausgeführt wird.
So kann ein generiertes Python-Dockerfile aussehen:
FROM python:3.14-slimWORKDIR /appCOPY requirements.txt .RUN pip install -r requirements.txtCOPY . .CMD ["python", "app.py"]Bereitgestellt von
Prüfe die Datei vor dem Build. Das generierte Ergebnis ist ein guter Startpunkt, aber oft sind Anpassungen nötig – zum Beispiel Umgebungsvariablen oder eine andere Base-Image-Version.
.dockerignore
Die .dockerignore-Datei sagt Docker, welche Dateien aus dem Build-Kontext ausgeschlossen werden. Das ist der Dateisatz, den Docker beim Image-Bau an die Build-Engine sendet.
Ohne sie würde Docker alles im Projektordner ins Image kopieren – inklusive .git, node_modules oder lokaler Konfigs, die in Produktion nichts verloren haben. Das bläht das Image auf und kann versehentlich Dateien einschließen.
Die compose.yaml-Datei dient zum Starten von Multi-Container-Setups. Sie definiert Services, Ports, Volumes und die Vernetzung der Container.
Für eine einfache Single-Container-App brauchst du sie nicht zwingend. Aber sobald Datenbank, Cache oder andere Dienste dazukommen, konfigurierst du alles zentral in Compose.
Beispiel: Docker init mit einem Python-Projekt
Lass uns docker init an einem echten Projekt laufen. Ich nutze eine minimale FastAPI-App mit einer einzigen Route.
Ein paar Dinge stechen heraus: PYTHONDONTWRITEBYTECODE=1 verhindert, dass Python .pyc-Dateien schreibt, und PYTHONUNBUFFERED=1 sorgt dafür, dass Logs in Echtzeit erscheinen statt gepuffert zu werden – beides sinnvolle Defaults für containerisierte Apps.
Der adduser-Block erzeugt einen nicht privilegierten Nutzer appuser zum Ausführen der Anwendung. Standardmäßig laufen Docker-Container als root, was ein Sicherheitsrisiko ist. Ein Non-Root-User begrenzt, was ein Angreifer im Fall eines Ausbruchs anrichten kann.
Der Schalter --mount=type=cache beim pip install weist Docker an, heruntergeladene Pakete zwischen Builds zu cachen. Folge-Builds müssen Abhängigkeiten dann nicht erneut laden – das beschleunigt den Prozess.
Die .dockerignore schließt Dateien aus, die nicht ins Image gehören. Lokale Umgebungsdateien wie .env, Versionskontrollordner wie .git und Python-Caches wie __pycache__ werden übersprungen. Auch das Dockerfile und die compose.yaml selbst werden ausgeschlossen – sie werden im Image nicht benötigt.
Die Compose-Datei definiert deine App als Service server, baut sie aus dem Dockerfile im aktuellen Verzeichnis und mappt Port 8000 des Hosts auf Port 8000 im Container.
Alle drei generierten Dateien enthalten Kommentare, die ich hier zur Übersichtlichkeit weggelassen habe.
Führe docker compose up --build aus – deine FastAPI-App ist dann unter http://localhost:8000 erreichbar.
FastAPI-App läuft im Container
Docker init vs. manuelles Dockerfile-Setup
Beide Wege liefern dir ein funktionierendes Dockerfile. Die Frage ist, wie viel Kontrolle du brauchst und wie schnell du starten willst.
Docker init
docker init ist der schnellere Weg. Du beantwortest ein paar Fragen und bekommst in unter einer Minute eine funktionierende, solide konfigurierte Basis. Die Dateien folgen den Best Practices von Docker – Non-Root-User, Build-Caching, sinnvolle .dockerignore-Muster – du startest nicht bei null.
Ideal, wenn du ein neues Projekt aufsetzt, jemand ins Team einarbeitest oder einfach eine belastbare Grundlage ohne Boilerplate-Aufwand willst.
Aber die Flexibilität ist begrenzt. Die Templates decken gängige Stacks gut ab, bleiben aber Templates. Hat dein Projekt eine ungewöhnliche Struktur oder spezielle Build-Anforderungen, stößt docker init an Grenzen.
Manuelles Setup
Schreibst du dein Dockerfile selbst, hast du die volle Kontrolle über jede Schicht, jede Anweisung und jeden Build-Schritt. Du kannst Multi-Stage-Builds implementieren, eigene Base-Images nutzen oder das Caching feintunen – Dinge, die docker init nicht vorwegnehmen kann.
Dafür musst du wissen, was du tust. Ein schlecht geschriebenes Dockerfile kann aufgeblasene Images, Sicherheitslücken oder schwer zu debuggende Fehler verursachen – besonders ohne Erfahrung.
Welche Option wählen
So kannst du es dir merken:
Vergleich: Docker init vs. manuelles Setup
Ein guter Ansatz ist: Starte mit docker init und passe die generierten Dateien später an, wenn die Anforderungen wachsen.
Wann du Docker init nutzen solltest
docker init ist nicht in jeder Situation das richtige Tool. Hier passt es – und hier nicht.
Nutze docker init, wenn:
Du ein neues Projekt startest: Du bekommst deine Docker-Konfiguration in unter einer Minute zum Laufen und kannst dich aufs Coden statt aufs Container-Setup konzentrieren
Du Docker lernst: Die generierten Dateien sind gut kommentiert und folgen Best Practices. Ein besserer Startpunkt als ein zufälliger Stack-Overflow-Schnipsel
Du prototypisierst: Wenn du schnell eine containerisierte Umgebung brauchst und Feintuning zweitrangig ist, liefert docker init etwas, das funktioniert
Du im Team standardisieren willst: Statt dass jede Person ein eigenes Dockerfile baut, liefert docker init allen den gleichen soliden Ausgangspunkt
Du solltest docker init hingegen meiden, wenn:
Du Multi-Stage-Builds brauchst: Wenn du die Imagegröße optimierst, indem du den Build in Stufen trennst – Kompilieren hier, Ausführen dort –, musst du das manuell schreiben. Das generierte Dockerfile ist einstufig
Du komplexe Produktionsanforderungen hast: Eigene Base-Images, fortgeschrittenes Caching, unübliche Projektlayouts – das kann docker init nicht vorwegnehmen. Da ist es schneller, das Dockerfile direkt selbst zu schreiben
Kurz gesagt: docker init ist ein Startpunkt. Nutze es zum Loslegen und bearbeite die Dateien, wenn die Anforderungen steigen.
Einschränkungen von Docker init
Mit wachsendem Projekt stößt du auf Grenzen. Hier ein paar davon.
Die generierten Dateien sind templatebasiert. Sie decken die häufigsten Fälle pro Stack ab – gut für Standards, weniger gut außerhalb dieses Rahmens. Hat dein Projekt eine ungewöhnliche Struktur, werden die Dateien das eventuell nicht berücksichtigen.
Außerdem gilt: Nacharbeit ist fast immer nötig. Defaults sind gut, aber eben Defaults. Du wirst Base-Image-Versionen fixieren, Umgebungsvariablen anpassen oder den Startbefehl ändern müssen. Betrachte die generierten Dateien als ersten Entwurf – nicht mehr.
docker init unterstützt auch keine fortgeschrittenen Build-Muster. Multi-Stage-Builds, eigene Build-Argumente, bedingte Logik und andere Techniken für Produktions-Images liegen außerhalb des Umfangs. Wenn du das brauchst, schreibst du das Dockerfile ohnehin selbst.
All das macht docker init nicht schlecht. Es geht um die richtige Erwartung: Es nimmt dir die leere Seite, aber nicht das Verständnis dafür ab, was in deinem Dockerfile steht.
Best Practices nach Docker init
Die von docker init erzeugten Dateien sind der Anfang. So machst du sie produktionstauglich.
Generierte Dateien durchgehen: Lies Dockerfile, .dockerignore und compose.yaml Zeile für Zeile. Dank Kommentaren geht das schnell. Verstehe, was drinsteht, bevor du darauf aufbaust
Imagegröße optimieren: Das Default-Base-Image ist python:3.x-slim – schon schlank. Du kannst weiter optimieren, indem du die .dockerignore schärfst und nur wirklich benötigte Dateien ins Image kopierst
Secrets und umgebungsspezifische Werte in Umgebungsvariablen auslagern: Keine API-Keys, DB-URLs oder Flags im Dockerfile hardcoden. Nutze Umgebungsvariablen – lokal per .env, in Produktion über das Secret-Management deiner Plattform
Lokal testen, bevor du etwas pushst: Führe docker compose up --build aus und prüfe, ob sich die App im Container wie außerhalb verhält. Checke Logs, Endpunkte und das Port-Mapping
Build-Schritte mit dem Wachstum verfeinern: Das generierte Dockerfile installiert Abhängigkeiten in einer Schicht. Reife Projekte profitieren von Schichtreihenfolgen: Schritte, die sich selten ändern, kommen nach vorn, damit Docker sie cachen kann. Wenn Builds langsamer werden, ist das meist die erste Stellschraube
Häufige Probleme und Troubleshooting
Wie immer in der Tech-Welt kann auch mal etwas schiefgehen. Darauf solltest du achten – und so behebst du es.
Falsche Projekterkennung
Wenn docker init den falschen Stack erkennt, erzeugt es unpassende Dateien. Das passiert oft bei gemischten Projektordnern oder wenn die gesuchte Datei fehlt – etwa requirements.txt in Python oder package.json in Node.js.
Wähle in der Abfrage einfach die korrekte Plattform manuell statt die Erkennung zu übernehmen.
Port-Konflikte
Wenn der Container startet, aber die App nicht erreichbar ist oder Docker meldet, der Port sei bereits belegt, nutzt wahrscheinlich ein anderer Prozess denselben Port.
Beende den kollidierenden Prozess oder ändere den Host-Port in compose.yaml:
ports:- 8001:8000# mappt Host-Port 8001 auf Container-Port 8000Bereitgestellt von
Links steht der Port auf deinem Rechner. Rechts der Port im Container, auf dem deine App lauscht.
Fehlende Abhängigkeiten
Wenn der Container baut, aber beim Start abstürzt, fehlen oft Abhängigkeiten. Prüfe, ob deine requirements.txt (oder Äquivalent) vollständig und aktuell ist. Wenn du lokal ein Paket hinzugefügt, aber die Datei nicht aktualisiert hast, fehlt es im Container.
Nutze docker compose logs, um die Fehlermeldung zu sehen:
Die Meldung verrät dir in der Regel, welches Paket fehlt.
Container startet nicht
Wenn der Container gar nicht startet, liegt es fast immer an der CMD-Zeile im Dockerfile. Prüfe, ob der Startbefehl deiner tatsächlichen Startweise entspricht.
Wenn die Einstiegsdatei anders heißt oder der Modulpfad nicht stimmt, beendet sich der Container. Korrigiere CMD, baue mit docker compose up --build neu und prüfe die Logs erneut.
Fazit
docker init ersetzt kein tiefes Docker-Verständnis, aber es nimmt dir das Problem der leeren Seite.
Mit einem einzigen Befehl bekommst du ein funktionierendes Dockerfile, eine .dockerignore und eine compose.yml – alles nach Dockers Best Practices. Das ist eine starke Basis für jedes neue Projekt und besser als ein kopiertes Template aus Stack Overflow oder ChatGPT.
Aber bleib nicht dabei stehen. Die generierten Dateien sind zum Anpassen gedacht. Prüfe sie, verfeinere die Build-Schritte, pinne deine Base-Image-Version und füge Umgebungsvariablen hinzu. Mit dem Wachstum deines Projekts wirst du dich immer weiter von den Defaults entfernen.
Wenn du die Docker-Grundlagen kennst, ist der nächste logische Schritt, Multi-Stage-Builds, Networking-Tools und Docker Compose zu lernen – all das behandeln wir im Intermediate DockerKurs.
Senior Data Scientist mit Sitz in Kroatien. Top Tech Writer mit über 700 veröffentlichten Artikeln, die mehr als 10 Millionen Mal aufgerufen wurden. Buchautor von Machine Learning Automation with TPOT.
FAQs
What is docker init and what does it do?⌄
Das ist ein Docker-CLI-Befehl, der die Konfigurationsdateien erzeugt, die zur Containerisierung eines Projekts nötig sind. Er erstellt ein Dockerfile, eine .dockerignore und eine compose.yaml auf Basis deines Projekttyps. Statt diese Dateien von Grund auf zu schreiben, beantwortest du ein paar Fragen – den Rest übernimmt docker init.
Do I need Docker experience to use docker init?⌄
Nein, der Befehl soll die Einstiegshürde für Docker-Neulinge senken. Dennoch profitierst du mehr, wenn du die Grundlagen von Containern verstehst. Die generierten Dateien sind gut kommentiert und helfen dir zu lernen, was jeder Konfigurationsschritt macht.
What programming languages does docker init support?⌄
docker init unterstützt derzeit Python, Node.js, Go, Java und .NET. Der Stack wird erkannt, indem der Projektordner nach sprachspezifischen Dateien wie requirements.txt oder package.json gescannt wird. Falls die Erkennung fehlschlägt oder der Stack nicht unterstützt wird, kannst du im Prompt eine Plattform manuell wählen.
Can I use docker init on an existing project?⌄
Ja, du kannst docker init in jedem Projektordner ausführen, nicht nur in neuen. Existieren bereits Docker-Konfigurationsdateien, warnt dich docker init vor dem Überschreiben. So ersetzt du veraltete oder schwache Konfigurationen durch eine saubere Best-Practice-Basis.
Does docker init generate production-ready Docker configuration?⌄
Die generierten Dateien folgen Dockers Best Practices – Non-Root-User, Build-Caching und ein schlankes Base-Image – und sind damit ein solider Start. Sie sind jedoch keine fertige Produktionskonfiguration. Du musst Umgebungsvariablen setzen, Build-Schritte feintunen und ggf. Multi-Stage-Builds ergänzen – abhängig von deinen Deployments.
Erforsche Pythons match-case: eine Anleitung zu seiner Syntax, Anwendungen in Data Science und ML sowie eine vergleichende Analyse mit dem traditionellen switch-case.
Mach dich mit Python-Datenstrukturen vertraut: Lerne mehr über Datentypen und primitive sowie nicht-primitive Datenstrukturen wie Strings, Listen, Stapel usw.
Lerne, wie man mit JSON in Python arbeitet, einschließlich Serialisierung, Deserialisierung, Formatierung, Leistungsoptimierung, Umgang mit APIs und Verständnis der Einschränkungen und Alternativen von JSON.
Lerne, wie du Python-Listen mit Techniken wie Slicing, List Comprehensions und itertools aufteilen kannst. Finde heraus, wann du welche Methode für die beste Datenverarbeitung nutzen solltest.
Entdecke die Möglichkeiten von Docker und Kubernetes: Mit diesem interaktiven Lernpfad kannst du Anwendungen in modernen Umgebungen entwickeln und bereitstellen.
Aus irgendeinem Grund dauert es immer länger als nötig, ein neues Projekt mit Docker aufzusetzen.
Du googelst ein Template, fügst es ein, änderst ein paar Zeilen und hoffst aufs Beste. Der Build schlägt fehl, also schraubst du nach und wiederholst das Spiel, bis es läuft. Jedes neue Projekt startet gleich – mit einer leeren Datei und der vagen Erinnerung daran, was letztes Mal funktioniert hat. Das ist eindeutig ein Setup-Problem, und Docker ist nicht schuld.
Die gute Nachricht:
docker initbehebt das. Der CLI-Befehl erkennt deinen Projekttyp und erzeugt einDockerfile, eine.dockerignoreund eine Compose-Datei.In diesem Artikel zeige ich dir, wie
docker initfunktioniert, wie du es Schritt für Schritt an einem echten Python-Projekt nutzt und wann es das richtige Werkzeug ist.Bist du neu bei Docker und Containerisierung? Erfahre, warum es zum Werkzeugkasten von Datenprofis gehört – mit unserem Introduction to Docker Kurs.
Was ist Docker init
docker initist ein CLI-Tool, das die Docker-Konfiguration für dein Projekt aufsetzt. Es erzeugt die Dateien, die du brauchst, um deine App zu containerisieren. Vorlagen oder Copy-Paste entfallen damit.Es erstellt drei Dateien:
Das Clevere ist die automatische Projekterkennung.
docker initanalysiert deine Struktur und erkennt deinen Stack – Python, Node.js, Go und weitere. Dann generiert es passende Dateien für diesen Stack statt eines generischen Templates.Es ist kein Deployment-Tool und verwaltet keine Container in Produktion. Es bringt nur deine Konfiguration an den Start, damit du dich auf die eigentliche Arbeit konzentrieren kannst.
So funktioniert Docker init
docker initfolgt bei jedem Lauf einem Ablauf in vier Schritten.Zuerst führst du
docker initim Projektordner aus. Docker scannt das Verzeichnis, erkennt den Projekttyp und wählt das passende Konfigurationstemplate. Danach führt dich ein kurzer interaktiver Dialog durch ein paar Fragen – etwa auf welchem Port deine App läuft und mit welchem Befehl sie startet. Sobald du antwortest, werden die Dateien erzeugt.Das Ganze dauert weniger als eine Minute.
Die Eingaben sind einfach und selten erklärungsbedürftig. Du kannst die Standardwerte mit Enter übernehmen oder eigene Werte eintragen, wenn sie nicht passen.
So sieht der erste Start des Befehls aus:
Docker-init-Setup-Bildschirm
Ich zeige dir den Ablauf als Nächstes genauer.
Docker init Schritt für Schritt nutzen
So kommst du vom Projektordner zum laufenden Container.
Schritt 1: In dein Projektverzeichnis wechseln
Öffne dein Terminal und wechsle ins Projekt-Root – also den Ordner mit deinem Anwendungscode.
docker initerzeugt Dateien relativ zu dem Verzeichnis, in dem du es ausführst. Achte also darauf, dass du im richtigen Ordner bist.Schritt 2: Docker init ausführen
Führe folgenden Befehl aus:
Docker scannt den Projektordner, erkennt deinen Stack und startet den interaktiven Setup-Dialog.
Schritt 3: Die Fragen beantworten
docker initstellt dir ein paar Fragen:Du kannst die vorgeschlagenen Defaults mit Enter übernehmen oder eigene Werte eingeben. Wenn
docker initdeinen Stack erkennt, reichen die Defaults meist für den Start.Schritt 4: Die erzeugten Dateien prüfen
Nach dem Dialog schreibt
docker initdrei Dateien in deinen Projektordner:Öffne die Dateien und lies sie durch. Die generierten Dateien enthalten Kommentare, die jede Zeile erklären. Nimm dir kurz Zeit, das zu verstehen, bevor du weiterbaust.
Schritt 5: Container bauen und starten
Baue und starte deinen Container mit Docker Compose:
Der Schalter
--buildweist Docker an, das Image aus deinemDockerfilezu bauen, bevor der Container startet. Läuft er, ist deine App über den in Schritt 3 angegebenen Port erreichbar.Unterstützte Projekttypen in Docker init
docker initunterstützt out of the box die gängigsten Stacks. Hier ein paar Beispiele:Die Erkennung läuft automatisch. Wenn du
docker initstartest, scannt es deinen Ordner nach sprachspezifischen Dateien – etwarequirements.txtfür Python oderpackage.jsonfür Node.js – und wählt auf dieser Basis das passende Template.Jedes Template ist auf den Stack zugeschnitten. Ein Python-Projekt bekommt ein anderes Base-Image, andere Installationsschritte und Startbefehle als ein Go-Projekt. Es ist kein One-Size-Fits-All-
Dockerfilemit einer ausgetauschten Sprachvariable – die Struktur ändert sich je nach Anwendung.Wenn
docker initdeinen Stack nicht erkennt, kannst du ihn im Dialog manuell auswählen.Von Docker init erzeugte Dateien
docker initerzeugt drei Dateien, die jeweils eine andere Rolle im Setup haben.Dockerfile
Das
Dockerfiledefiniert, wie Docker dein Container-Image baut. Es legt fest, von welchem Base-Image gestartet wird, wie Abhängigkeiten installiert werden und welcher Befehl beim Containerstart ausgeführt wird.So kann ein generiertes Python-
Dockerfileaussehen:Prüfe die Datei vor dem Build. Das generierte Ergebnis ist ein guter Startpunkt, aber oft sind Anpassungen nötig – zum Beispiel Umgebungsvariablen oder eine andere Base-Image-Version.
.dockerignore
Die
.dockerignore-Datei sagt Docker, welche Dateien aus dem Build-Kontext ausgeschlossen werden. Das ist der Dateisatz, den Docker beim Image-Bau an die Build-Engine sendet.Ohne sie würde Docker alles im Projektordner ins Image kopieren – inklusive
.git,node_modulesoder lokaler Konfigs, die in Produktion nichts verloren haben. Das bläht das Image auf und kann versehentlich Dateien einschließen.Eine typische
.dockerignoresieht so aus:Docker-Compose-Datei
Die
compose.yaml-Datei dient zum Starten von Multi-Container-Setups. Sie definiert Services, Ports, Volumes und die Vernetzung der Container.Für eine einfache Single-Container-App brauchst du sie nicht zwingend. Aber sobald Datenbank, Cache oder andere Dienste dazukommen, konfigurierst du alles zentral in Compose.
Beispiel: Docker init mit einem Python-Projekt
Lass uns
docker initan einem echten Projekt laufen. Ich nutze eine minimale FastAPI-App mit einer einzigen Route.So sieht die Struktur vor
docker initaus:app.pyhat eine einzige Hello-World-Route:Und
requirements.txtenthält diese zwei Abhängigkeiten:docker init ausführen
Wechsle in den Projektordner und führe aus:
Docker init hat das Projekt erkannt
docker initerkennt Python anhand derrequirements.txtund stellt dir ein paar Fragen. So sehen die Prompts aus – und so kannst du antworten:Docker-init-Eingaben für ein Python-Projekt
Was generiert wird
Nach der Beantwortung der Fragen sieht dein Projektordner so aus:
Neue Projektordner-Struktur
Es gibt drei neue Dateien. Schauen wir sie uns an.
Das Dockerfile
Ein paar Dinge stechen heraus:
PYTHONDONTWRITEBYTECODE=1verhindert, dass Python.pyc-Dateien schreibt, undPYTHONUNBUFFERED=1sorgt dafür, dass Logs in Echtzeit erscheinen statt gepuffert zu werden – beides sinnvolle Defaults für containerisierte Apps.Der
adduser-Block erzeugt einen nicht privilegierten Nutzerappuserzum Ausführen der Anwendung. Standardmäßig laufen Docker-Container als root, was ein Sicherheitsrisiko ist. Ein Non-Root-User begrenzt, was ein Angreifer im Fall eines Ausbruchs anrichten kann.Der Schalter
--mount=type=cachebeimpip installweist Docker an, heruntergeladene Pakete zwischen Builds zu cachen. Folge-Builds müssen Abhängigkeiten dann nicht erneut laden – das beschleunigt den Prozess.Die .dockerignore
Die
.dockerignoreschließt Dateien aus, die nicht ins Image gehören. Lokale Umgebungsdateien wie.env, Versionskontrollordner wie.gitund Python-Caches wie__pycache__werden übersprungen. Auch dasDockerfileund diecompose.yamlselbst werden ausgeschlossen – sie werden im Image nicht benötigt.Die compose.yaml
Die Compose-Datei definiert deine App als Service
server, baut sie aus demDockerfileim aktuellen Verzeichnis und mappt Port8000des Hosts auf Port8000im Container.Alle drei generierten Dateien enthalten Kommentare, die ich hier zur Übersichtlichkeit weggelassen habe.
Führe
docker compose up --buildaus – deine FastAPI-App ist dann unterhttp://localhost:8000erreichbar.FastAPI-App läuft im Container
Docker init vs. manuelles Dockerfile-Setup
Beide Wege liefern dir ein funktionierendes
Dockerfile. Die Frage ist, wie viel Kontrolle du brauchst und wie schnell du starten willst.Docker init
docker initist der schnellere Weg. Du beantwortest ein paar Fragen und bekommst in unter einer Minute eine funktionierende, solide konfigurierte Basis. Die Dateien folgen den Best Practices von Docker – Non-Root-User, Build-Caching, sinnvolle.dockerignore-Muster – du startest nicht bei null.Ideal, wenn du ein neues Projekt aufsetzt, jemand ins Team einarbeitest oder einfach eine belastbare Grundlage ohne Boilerplate-Aufwand willst.
Aber die Flexibilität ist begrenzt. Die Templates decken gängige Stacks gut ab, bleiben aber Templates. Hat dein Projekt eine ungewöhnliche Struktur oder spezielle Build-Anforderungen, stößt
docker initan Grenzen.Manuelles Setup
Schreibst du dein
Dockerfileselbst, hast du die volle Kontrolle über jede Schicht, jede Anweisung und jeden Build-Schritt. Du kannst Multi-Stage-Builds implementieren, eigene Base-Images nutzen oder das Caching feintunen – Dinge, diedocker initnicht vorwegnehmen kann.Dafür musst du wissen, was du tust. Ein schlecht geschriebenes
Dockerfilekann aufgeblasene Images, Sicherheitslücken oder schwer zu debuggende Fehler verursachen – besonders ohne Erfahrung.Welche Option wählen
So kannst du es dir merken:
Vergleich: Docker init vs. manuelles Setup
Ein guter Ansatz ist: Starte mit
docker initund passe die generierten Dateien später an, wenn die Anforderungen wachsen.Wann du Docker init nutzen solltest
docker initist nicht in jeder Situation das richtige Tool. Hier passt es – und hier nicht.Nutze
docker init, wenn:Du ein neues Projekt startest: Du bekommst deine Docker-Konfiguration in unter einer Minute zum Laufen und kannst dich aufs Coden statt aufs Container-Setup konzentrieren
Du Docker lernst: Die generierten Dateien sind gut kommentiert und folgen Best Practices. Ein besserer Startpunkt als ein zufälliger Stack-Overflow-Schnipsel
Du prototypisierst: Wenn du schnell eine containerisierte Umgebung brauchst und Feintuning zweitrangig ist, liefert
docker initetwas, das funktioniertDu im Team standardisieren willst: Statt dass jede Person ein eigenes
Dockerfilebaut, liefertdocker initallen den gleichen soliden AusgangspunktDu solltest
docker inithingegen meiden, wenn:Du Multi-Stage-Builds brauchst: Wenn du die Imagegröße optimierst, indem du den Build in Stufen trennst – Kompilieren hier, Ausführen dort –, musst du das manuell schreiben. Das generierte
Dockerfileist einstufigDu komplexe Produktionsanforderungen hast: Eigene Base-Images, fortgeschrittenes Caching, unübliche Projektlayouts – das kann
docker initnicht vorwegnehmen. Da ist es schneller, dasDockerfiledirekt selbst zu schreibenKurz gesagt:
docker initist ein Startpunkt. Nutze es zum Loslegen und bearbeite die Dateien, wenn die Anforderungen steigen.Einschränkungen von Docker init
Mit wachsendem Projekt stößt du auf Grenzen. Hier ein paar davon.
Die generierten Dateien sind templatebasiert. Sie decken die häufigsten Fälle pro Stack ab – gut für Standards, weniger gut außerhalb dieses Rahmens. Hat dein Projekt eine ungewöhnliche Struktur, werden die Dateien das eventuell nicht berücksichtigen.
Außerdem gilt: Nacharbeit ist fast immer nötig. Defaults sind gut, aber eben Defaults. Du wirst Base-Image-Versionen fixieren, Umgebungsvariablen anpassen oder den Startbefehl ändern müssen. Betrachte die generierten Dateien als ersten Entwurf – nicht mehr.
docker initunterstützt auch keine fortgeschrittenen Build-Muster. Multi-Stage-Builds, eigene Build-Argumente, bedingte Logik und andere Techniken für Produktions-Images liegen außerhalb des Umfangs. Wenn du das brauchst, schreibst du dasDockerfileohnehin selbst.All das macht
docker initnicht schlecht. Es geht um die richtige Erwartung: Es nimmt dir die leere Seite, aber nicht das Verständnis dafür ab, was in deinemDockerfilesteht.Best Practices nach Docker init
Die von
docker initerzeugten Dateien sind der Anfang. So machst du sie produktionstauglich.Generierte Dateien durchgehen: Lies
Dockerfile,.dockerignoreundcompose.yamlZeile für Zeile. Dank Kommentaren geht das schnell. Verstehe, was drinsteht, bevor du darauf aufbaustImagegröße optimieren: Das Default-Base-Image ist
python:3.x-slim– schon schlank. Du kannst weiter optimieren, indem du die.dockerignoreschärfst und nur wirklich benötigte Dateien ins Image kopierstSecrets und umgebungsspezifische Werte in Umgebungsvariablen auslagern: Keine API-Keys, DB-URLs oder Flags im
Dockerfilehardcoden. Nutze Umgebungsvariablen – lokal per.env, in Produktion über das Secret-Management deiner PlattformLokal testen, bevor du etwas pushst: Führe
docker compose up --buildaus und prüfe, ob sich die App im Container wie außerhalb verhält. Checke Logs, Endpunkte und das Port-MappingBuild-Schritte mit dem Wachstum verfeinern: Das generierte
Dockerfileinstalliert Abhängigkeiten in einer Schicht. Reife Projekte profitieren von Schichtreihenfolgen: Schritte, die sich selten ändern, kommen nach vorn, damit Docker sie cachen kann. Wenn Builds langsamer werden, ist das meist die erste StellschraubeHäufige Probleme und Troubleshooting
Wie immer in der Tech-Welt kann auch mal etwas schiefgehen. Darauf solltest du achten – und so behebst du es.
Falsche Projekterkennung
Wenn
docker initden falschen Stack erkennt, erzeugt es unpassende Dateien. Das passiert oft bei gemischten Projektordnern oder wenn die gesuchte Datei fehlt – etwarequirements.txtin Python oderpackage.jsonin Node.js.Wähle in der Abfrage einfach die korrekte Plattform manuell statt die Erkennung zu übernehmen.
Port-Konflikte
Wenn der Container startet, aber die App nicht erreichbar ist oder Docker meldet, der Port sei bereits belegt, nutzt wahrscheinlich ein anderer Prozess denselben Port.
Beende den kollidierenden Prozess oder ändere den Host-Port in
compose.yaml:Links steht der Port auf deinem Rechner. Rechts der Port im Container, auf dem deine App lauscht.
Fehlende Abhängigkeiten
Wenn der Container baut, aber beim Start abstürzt, fehlen oft Abhängigkeiten. Prüfe, ob deine
requirements.txt(oder Äquivalent) vollständig und aktuell ist. Wenn du lokal ein Paket hinzugefügt, aber die Datei nicht aktualisiert hast, fehlt es im Container.Nutze
docker compose logs, um die Fehlermeldung zu sehen:Die Meldung verrät dir in der Regel, welches Paket fehlt.
Container startet nicht
Wenn der Container gar nicht startet, liegt es fast immer an der
CMD-Zeile imDockerfile. Prüfe, ob der Startbefehl deiner tatsächlichen Startweise entspricht.Für das FastAPI-Beispiel sollte er so aussehen:
Wenn die Einstiegsdatei anders heißt oder der Modulpfad nicht stimmt, beendet sich der Container. Korrigiere
CMD, baue mitdocker compose up --buildneu und prüfe die Logs erneut.Fazit
docker initersetzt kein tiefes Docker-Verständnis, aber es nimmt dir das Problem der leeren Seite.Mit einem einzigen Befehl bekommst du ein funktionierendes
Dockerfile, eine.dockerignoreund einecompose.yml– alles nach Dockers Best Practices. Das ist eine starke Basis für jedes neue Projekt und besser als ein kopiertes Template aus Stack Overflow oder ChatGPT.Aber bleib nicht dabei stehen. Die generierten Dateien sind zum Anpassen gedacht. Prüfe sie, verfeinere die Build-Schritte, pinne deine Base-Image-Version und füge Umgebungsvariablen hinzu. Mit dem Wachstum deines Projekts wirst du dich immer weiter von den Defaults entfernen.
Wenn du die Docker-Grundlagen kennst, ist der nächste logische Schritt, Multi-Stage-Builds, Networking-Tools und Docker Compose zu lernen – all das behandeln wir im Intermediate Docker Kurs.