Lernpfad
Docker ENTRYPOINT
ist eine Dockerfile-Anweisung, die den Standardbefehl definiert und steuert, der beim Start deines Containers ausgeführt wird. Die Beherrschung von ENTRYPOINT
vereinfacht die Entwicklung vorhersehbarer, reproduzierbarer und wartbarer Container, die sich wie erwartet verhalten.
Dieser Leitfaden soll fortgeschrittenen DevOps-Ingenieuren, Backend-Entwicklern und Softwareingenieuren helfen, ENTRYPOINT
sicher zu nutzen und häufige Fallstricke zu vermeiden.
Wenn du Docker noch nicht kennst, solltest du dir unser Tutorial Einführung in Docker ansehen, denn dieses Tutorial setzt ein gewisses Maß an Wissen über Docker voraus. Wenn du dich mit Docker vertraut machen willst, besuche unseren Kurs Einführung in Docker.
Was ist Docker ENTRYPOINT?
ENTRYPOINT
definiert den Befehl, der standardmäßig ausgeführt wird, wenn dein Docker-Container gestartet wird. Anders als bei CMD
sorgt die Anweisung ENTRYPOINT
für Konsistenz, indem sie Befehle bereitstellt, die bei jedem Start des Containers ausgeführt werden.
Wie funktioniert Docker ENTRYPOINT?
ENTRYPOINT
in einem Dockerfile definiert den Hauptbefehl, der immer ausgeführt wird, wenn du einen Container aus einem Image startest. Das ist so, als würde man sagen: "Egal, welche Argumente der Benutzer beim Ausführen dieses Containers angibt, beginne immer mit diesem Befehl."
Mehr über Dockerfiles erfährst du in unserem Tutorial Wie man eine Anwendung mit Docker containerisiert.
Zum Beispiel in einem Dockerfile:
ENTRYPOINT ["python", "app.py"]
Wenn du jetzt läufst:
docker run myimage
Sie wird immer ausgeführt:
python app.py
Hier ist ein Flussdiagramm, wie ENTRYPOINT
funktioniert:
+---------------------------+
| Dockerfile |
+---------------------------+
| |
| ENTRYPOINT ["app"] |
| CMD ["--default-arg"] |
+---------------------------+
|
v
+---------------------------+
| Build Docker Image |
+---------------------------+
|
v
+---------------------------+
| Run Container |
| (docker run image) |
+---------------------------+
|
v
+---------------------------+
| Executed Command: |
| app --default-arg |
+---------------------------+
Override CMD at Runtime:
(docker run image --custom-arg)
|
v
+---------------------------+
| Executed Command: |
| app --custom-arg |
+---------------------------+
Override ENTRYPOINT at Runtime:
(docker run --entrypoint /bin/bash image)
|
v
+---------------------------+
| Executed Command: |
| /bin/bash |
+---------------------------+
Grundlagen von Docker ENTRYPOINT
Wenn du die Grundlagen verstehst, kannst du ENTRYPOINT viel sicherer einsetzen.
Konzeptioneller Rahmen
ENTRYPOINT
gibt die ausführbare Datei oder das Skript an, das automatisch ausgeführt wird, wenn dein Container startet. Es ist der Hauptprozess deines Containers, der das Verhalten deines Containers vorhersehbar steuert.
Kernsyntax
Die Dockerfile-Syntax für ENTRYPOINT
ist einfach und wird normalerweise zusammen mit CMD
verwendet, um Standardargumente oder -parameter bereitzustellen. ENTRYPOINT
definiert die ausführbare Datei, während CMD
Standardargumente angibt, die ENTRYPOINT
verwendet.
Das Verständnis von Docker-Konzepten wie ENTRYPOINT ist wichtig, um in Vorstellungsgesprächen für Data Science zu bestehen. In unseren Top 26 Docker-Interview-Fragen und -Antworten für 2025 erfährst du mehr über häufige Interviewfragen.
ENTRYPOINT Syntaxformulare
Docker ENTRYPOINT
gibt es in zwei verschiedenen Formen: als test-shell und als exec. Wenn du die Unterschiede zwischen diesen Formen kennst, kannst du eine kluge Wahl treffen.
test-shell Form
Beispielsyntax:
ENTRYPOINT /usr/bin/ping -c 3 localhost
Die test-shell Form ermöglicht die einfache Integration von Shell-Funktionen (Variablenersetzung, Umgebungsmanipulation).
Sie kann jedoch zu einer schlechten Signalverarbeitung führen; sie läuft innerhalb des Zwischenprozesses /bin/sh
und nicht direkt als PID 1, was zu Problemen beim Stoppen und Neustarten von Containern führt.
PID 1 ist der erste Prozess, der beim Systemstart gestartet wird. In Docker verwaltet der Prozess PID 1 alle anderen Prozesse innerhalb des Containers.
Ausführungsform
Beispielsyntax:
ENTRYPOINT ["/usr/bin/ping", "-c", "3"]
Die Exec-Form gewährleistet eine direkte Befehlsausführung als PID 1, was zu einer zuverlässigen Signalverarbeitung und Steuerung führt.
Sie bietet jedoch keine direkte Shell-Unterstützung oder eine automatische Erweiterung der Umgebungsvariablen; für ein Shell-ähnliches Verhalten ist zusätzliches Skripting erforderlich.
ENTRYPOINT vs. CMD: Hauptunterschiede und Anwendungsfälle
Die Unterscheidung zwischen ENTRYPOINT
und CMD
verhindert Verwirrung und ermöglicht ein vorhersehbares Containerverhalten.
Vorrang der Ausführung
ENTRYPOINT
legt die ausführbare Datei fest, die immer ausgeführt wird, während CMD
Standardargumente liefert. Wenn sowohl ENTRYPOINT
als auch CMD
definiert sind, hat ENTRYPOINT
Vorrang und wird mit den Werten von CMD
als Argumenten ausgeführt, es sei denn, sie werden zur Laufzeit explizit überschrieben.
Einsatzszenarien
ENTRYPOINT
sollte verwendet werden, wenn du eine konsistente, erzwungene Ausführung bei jedem Start möchtest, wie z.B. bei Containern mit nur einem Befehl oder bei Wrapper-Skripten für Legacy-Anwendungen. Umgekehrt eignet sich CMD
für die Angabe von Standardargumenten, was mehr Flexibilität bei Laufzeitüberschreibungen ermöglicht.
Feature |
ENTRYPOINT |
CMD |
Zweck |
Ausführbare Datei immer ausführen |
Standard-Argumente |
Überwindbar? |
Nur mit docker run --entrypoint |
Ja, mit Kommandozeilenargumenten |
Kombinierte Nutzung |
CMD liefert Argumente für ENTRYPOINT |
Wird ignoriert, wenn der Befehl zur Laufzeit übergeben wird |
Typische Verwendung |
Festes Verhalten (z.B. App ausführen) |
Optionale Konfiguration (z.B. Standard-Flags) |
Unsere Top 18 Docker-Befehle zum Erstellen, Ausführen und Verwalten von Containern decken die wichtigsten Docker-Befehle ab, von Container-Grundlagen bis hin zu Volumes und Netzwerken, damit du Anwendungen in verschiedenen Umgebungen sicher verwalten kannst.
Praktisches Beispiel
Eine typische Kombination aus ENTRYPOINT
und CMD
wird durch dieses Dockerfile veranschaulicht:
FROM ubuntu
ENTRYPOINT ["/usr/bin/ping", "-c", "3"]
CMD ["localhost"]
Dieser Docker-Container sendet standardmäßig immer drei Pings an localhost. Die Benutzer können dieses Standardziel zur Laufzeit mit anderen Hosts überschreiben, ohne dass das vorhersehbare Ausführungsverhalten von ENTRYPOINT beeinträchtigt wird:
docker run ping-container google.com
Mehr über die Bereitstellung von Anwendungen mit Docker erfährst du in unserem Kurs Containerisierung und Virtualisierung mit Docker und Kubernetes.
Kombination von ENTRYPOINT mit CMD
Die richtige Kombination von ENTRYPOINT
mit CMD
bietet Flexibilität, ohne die Konsistenz zu beeinträchtigen.
CMD als Standardargumente
Die Einstellung ENTRYPOINT
legt den Hauptbefehl zuverlässig fest; CMD
liefert Standardparameter, die einfach überschrieben werden können, ohne dass die Bilder neu erstellt werden müssen.
Laufzeitargumente überschreiben
Argumente, die während docker run
angegeben werden, überschreiben nur die von CMD definierten Standardwerte. ENTRYPOINT
bleibt konsistent und vereinfacht so die Erfahrungen der Benutzer.
ENTRYPOINT zur Laufzeit außer Kraft setzen
Docker erlaubt es, ENTRYPOINT
direkt zur Laufzeit zu überschreiben, so dass du Debugging betreiben kannst, ohne dein Dockerfile-Image neu zu erstellen.
Verwendung von Entrypoint-Flags
Docker bietet ein einfaches Flag --entrypoint
, das das Verhalten des Containers vorübergehend ändert.
docker run -it --entrypoint /bin/bash my-container
Temporäre Überschreibungen ermöglichen die Fehlersuche mit der test-shell und beheben häufige Startprobleme, ohne dass das Image neu erstellt werden muss oder erhebliche Verzögerungen auftreten.
Anpassen des ENTRYPOINT-Verhaltens
Docker bietet Flexibilität, wenn ENTRYPOINT
erweiterte Anpassungen erfordert.
ENTRYPOINT zur Laufzeit außer Kraft setzen
Du kannst den Befehl ENTRYPOINT
zur Laufzeit dynamisch überschreiben, indem du docker run --entrypoint
zum Debuggen oder zum schnellen Ändern von Kontexten verwendest, ohne dein Dockerfile wiederholt zu ändern.
ENTRYPOINT mit Argumenten
Argumente, die in Containern übergeben werden, werden zur Laufzeit zu ENTRYPOINT
Parametern; Best Practices empfehlen eine minimale ENTRYPOINT
Komplexität neben CMD
für maximale Klarheit und Kontrolle.
Wrapper-Skripte
Bash-Skripte, die als ENTRYPOINT
Befehle eingeführt werden, können bedingte Startlogik ausführen, auf abhängige Dienste (wie Datenbanken) warten, Einrichtungsaufgaben erledigen und vieles mehr, während sie eine saubere Dockerfile-Syntax beibehalten.
Beispiele und Muster aus der realen Welt
Praktische Anwendungen auf ENTRYPOINT
können typische, realistische Verwendungen veranschaulichen. Schauen wir uns einige von ihnen an.
Ein-Befehl-Container
Für die Einrichtung einer Flask-Anwendung:
FROM python:3.11-alpine
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
ENTRYPOINT ["python", "app.py"]
CMD ["--port", "8080"]
In der obigen Dockerdatei:
ENTRYPOINT ["python", "app.py"]
legt die Standardausführungsdatei fest. Das ist das, was läuft, wenn der Container startet.CMD ["--port", "8080"]
liefert Standardargumente (--port 8080
) für den BefehlENTRYPOINT
.
Der vollständige Standardbefehl wird ausgeführt:
python app.py --port 8080
Wenn du beim Ausführen des Containers CMD
überschreibst (z.B. docker run myimage --port 9090
), ersetzt er --port 8080
.
Skript als ENTRYPOINT
Hier kannst du die Logik für die Unterstützung einrichten:
entrypoint.sh:
#!/bin/sh
until nc -z db_host 5432; do
echo "Waiting for database to become available."
sleep 2
done
exec python app.py "$@"
Dockerfile:
FROM python:3.11-alpine
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
COPY entrypoint.sh .
RUN chmod +x entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]
CMD ["--port", "8080"]
In den oben genannten Dateien:
entrypoint.sh
wird verwendet, um auf die Datenbankverbindung zu warten.exec python app.py "$@"
ersetzt den aktuellen Prozess der test-shell durch pythonapp.py
und übergibt alle zusätzlichen Argumente. "$@" stammt aus den ParameternCMD
oderdocker run
.COPY entrypoint.sh
kopiert das Skriptentrypoint.sh
in das Verzeichnis/app
des Containers.ENTRYPOINT ["./entrypoint.sh"]
legtentrypoint.sh
als Standard-Startskript fest, wenn der Container gestartet wird.CMD ["--port", "8080"]
liefert Standardargumente, die an das Skriptentrypoint.sh
und schließlich anpython app.py
übergeben werden. Der endgültig ausgeführte Befehl sieht dann so aus:python app.py --port 8080
.
Signalverarbeitung und PID 1
ENTRYPOINT
Die Form von PID 1 hat erhebliche Auswirkungen auf die Fähigkeit von Docker, Signale zu verarbeiten, da PID 1 sehr wichtig ist. Lass uns das genauer untersuchen:
Ausführungsform und PID 1
Das Exec-Formular führt Befehle direkt als PID 1-Prozess von Docker aus, was die Zuverlässigkeit der Signalweiterleitung und das richtige Verhalten beim Anhalten oder Neustart verbessert.
Grenzen der test-shell Form
Das Shell-Formular fügt einen zwischengeschalteten Shell-Prozess hinzu. Dadurch wird verhindert, dass Beendigungssignale die Anwendungsprozesse erreichen, wodurch die Gefahr besteht, dass Container stecken bleiben oder nicht mehr reagieren.
Debuggen des ENTRYPOINT-Verhaltens
Die Fehlersuche bei entrypoint
Konfigurationen ist mit bestimmten Techniken und Tricks einfacher. Entdecken wir sie im Folgenden.
Verwendung von --entrypoint zur Fehlersuche
Temporäre Überschreibungen ermöglichen interaktive Test-Shells in deinen Containern, ohne dass das Image neu erstellt werden muss. So kannst du verschiedene Dinge in deiner Anwendung testen, ohne das Image neu zu erstellen.
ENTRYPOINT-Protokolle anzeigen
Das Überprüfen von Ausgabeprotokollen mit docker logs
vereinfacht das Nachverfolgen der Ausführungshistorie und das klare und schnelle Auffinden von Konfigurationsproblemen.
Vermeide die Änderung von Dockerdateien für temporäre Tests
Mit den debuggingfreundlichen ENTRYPOINT
Überschreibungen zur Laufzeit kannst du Probleme isolieren und beheben, ohne die Container-Images immer wieder zu ändern und neu zu erstellen.
Optimierungstechniken und Best Practices
Im Folgenden werden einige Optimierungen empfohlen, um die Zuverlässigkeit und Wartungsfreundlichkeit von ENTRYPOINT
zu verbessern.
Exec-Formular für die Signalverarbeitung verwenden
Bevorzuge immer die Form exec
, um die richtigen Abschlusssignale zu erhalten und die Zuverlässigkeit und Verwaltung des Containers insgesamt zu verbessern.
ENTRYPOINT und CMD effektiv kombinieren
Trenne deine ausführbare Datei (ENTRYPOINT) von den Standard-Laufzeitargumenten (CMD) und nutze Laufzeitüberschreibungen für maximale Flexibilität und einfache Verwaltung.
Minimiere die Komplexität in ENTRYPOINT
Halte ENTRYPOINT
einfach und delegiere komplexe Startlogik oder Bedingungen in separate Skripte, um die Komplexität zu beherrschen und die Übersichtlichkeit zu erhöhen.
Fortgeschrittene Anwendungsfälle und Patterns
Lass uns einige fortgeschrittene ENTRYPOINT
Anwendungsfälle und Muster erkunden.
Mehrstufige Bauten mit ENTRYPOINT
ENTRYPOINT
in den letzten Docker-Phasen erzwingt eine zuverlässige Ausführung und sorgt für sauberere Builds, die speziell auf Produktionsaufgaben innerhalb von CI/CD-Workflows zugeschnitten sind.
Dynamische ENTRYPOINT-Skripte
ENTRYPOINT
Skripte können ihre Startlogik dynamisch an die bereitgestellten Umgebungsvariablen oder Laufzeitargumente anpassen und sich so nahtlos in verschiedene Anwendungskontexte einfügen.
ENTRYPOINT für CI/CD-Pipelines
Die Nutzung von ENTRYPOINT
verbessert die Konsistenz zwischen Test- und Produktionsumgebungen und sorgt für vorhersehbares Laufzeitverhalten und Wiederholbarkeit. Du kannst zum Beispiel ENTRYPOINT
für ein Skript einrichten, das Tests automatisch ausführt.
Andere Anwendungen sind:
- Eine
ENTRYPOINT
, die auf die Datenbank wartet, dann Migrationen durchführt und schließlich dieapp
startet. - Eine
ENTRYPOINT
, die automatisch Assets kompiliert, Code lintet oder Konfigurationen validiert. ENTRYPOINT
Skripte können Umgebungen (Dev, Staging, Production) erkennen und die Einstellungen beim Start des Containers entsprechend anpassen.
Hier ist ein Beispiel für ein Docker-Image, das automatisch Tests durchführt:
FROM python:3.11
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
ENTRYPOINT ["pytest"]
Die .gitlab-ci.yml
würde wie folgt aussehen:
build-test:
image: docker:latest
services:
- docker:dind
script:
- docker build -t myapp-test .
- docker run myapp-test # <-- No need to specify 'pytest', ENTRYPOINT does it
Wenn docker run
ausgeführt wird, löst es automatisch pytest
innerhalb des Containers aus. So wird sichergestellt, dass alle Tests gefunden und sofort durchgeführt werden.
Die Verwendung von ENTRYPOINT
in CI/CD hat mehrere Vorteile:
- Jeder Container startet und verhält sich auf dieselbe Weise.
- Vereinfacht CI/CD-Skripte, weil du nicht jedes Mal vollständige Befehle übergeben musst.
- Automatisiert Prüfungen vor dem Start, Testläufe und Migrationen und reduziert so menschliche Fehler.
Häufige Fallstricke und Fehlersuche
ENTRYPOINT
hat ein paar Fallstricke, die du in deinen Arbeitsabläufen vermeiden solltest.
Missbräuchliche Verwendung der test-shell Form
Die Test-Shell-Form behindert Signale und Container-Manager; bevorzuge immer die exec
Form, um Signale richtig zu behandeln, Container zu verlassen und sauber zu stoppen.
Überkomplizierung ENTRYPOINT
Komplexe Skripte, denen es an Klarheit oder Zuverlässigkeit mangelt, verschlechtern sich bei der Fehlersuche oder der laufenden Wartung weiter. Einfache ENTRYPOINT
Setups vereinfachen die Fehlersuche erheblich.
Fazit
Wenn du Docker ENTRYPOINT
verstehst und effektiv implementierst, kannst du vorhersehbare, zuverlässige und wartbare Docker-Container für deine Anwendungen erstellen. Richtig eingesetzt, schafft ENTRYPOINT
Konsistenz, ohne dass die Flexibilität durch das leistungsstarke Override-System von Docker beeinträchtigt wird. Das sorgfältige Experimentieren mit den ENTRYPOINT
Mustern und die Einhaltung der oben beschriebenen Best Practices vereinfacht die Nutzung von Docker erheblich und führt zu reibungsloseren Bereitstellungs- und Verwaltungszyklen in der Produktion.
Schau dir unsere Docker-Kurse an, um weitere Docker-Themen zu erforschen, wie zum Beispiel:

Docker ENTRYPOINT FAQs
Was ist der Unterschied zwischen ENTRYPOINT und CMD in einem Dockerfile?
ENTRYPOINT definiert den Hauptbefehl, der immer ausgeführt wird, wenn der Container startet. CMD bietet Standardargumente für diesen Befehl. Wenn beide verwendet werden, werden die CMD-Werte an ENTRYPOINT übergeben, es sei denn, sie werden zur Laufzeit überschrieben.
Wann sollte ich die exec-Form und wann die test-shell-Form von ENTRYPOINT verwenden?
Verwende die exec-Form (z. B. ["app", "arg1"]), wenn du eine korrekte Signalverarbeitung und eine direkte Ausführung von PID 1 wünschst. Die Shell-Form (z. B. "app arg1") ist nur bedingt geeignet, da sie eine Shell erzeugt, die Signale möglicherweise nicht korrekt weiterleitet und damit für den Produktionseinsatz weniger zuverlässig ist.
Kann ich ENTRYPOINT zur Laufzeit außer Kraft setzen, ohne das Dockerfile zu ändern?
Ja, du kannst ENTRYPOINT zur Laufzeit überschreiben, indem du das --entrypoint Flag bei docker run verwendest. Dies ist nützlich für die Fehlersuche oder um vorübergehend andere Befehle auszuführen.
Warum halten manche Container nicht richtig an, wenn ich ENTRYPOINT verwende?
Das passiert oft, wenn du die Shell-Form von ENTRYPOINT verwendest, die durch die dazwischenliegende test-shell eine korrekte Signalweiterleitung an den Hauptprozess verhindert. Verwende das Formular exec, um dieses Problem zu vermeiden.
Ist es eine schlechte Praxis, viel Logik in ein ENTRYPOINT-Skript einzubauen?
Ja. Es empfiehlt sich, die ENTRYPOINT-Skripte möglichst klein zu halten. Delegiere komplexe Logik an separate Skripte oder Initialisierungsprogramme. Das verbessert die Wartbarkeit und verringert die Reibung bei der Fehlersuche.