ENTRYPOINT ist eine der wichtigsten Konfigurationsoptionen von Docker. Sie befindet sich in der Dockerfile und ermöglicht es dir, das Standardverhalten des Containers festzulegen. Diese Fähigkeit macht ENTRYPOINT extrem hilfreich, um das Verhalten von Containern während der Laufzeit zu automatisieren.

Dieser Artikel befasst sich ausführlich mit der Verwendung von ENTRYPOINT in Docker und erklärt, wie es funktioniert, warum es wichtig ist und wie man es richtig konfiguriert.

Docker ENTRYPOINT Erläutert

ENTRYPOINT dient als Startpunkt für den Laufzeitprozess eines Docker-Containers. Wenn du ein Docker-Image erstellst und es als Container instanziierst, wird standardmäßig der Befehl ENTRYPOINT ausgeführt.

ENTRYPOINT damit kannst du den Hauptzweck des Containers festlegen, z. B. die Ausführung eines Webservers, einer Datenbank oder einer Anwendung. Außerdem kannst du zur Laufzeit Argumente übergeben, um das Verhalten des Containers anzupassen.

Syntax und Verwendung von ENTRYPOINT

Die beiden Syntaxoptionen für die Definition von ENTRYPOINT in einem Dockerfile sind die Shell-Form und die exec-Form. Bei beiden Ansätzen wird eine Zeile in das Dockerfile eingefügt. Da sich die Konfiguration von ENTRYPOINT nicht direkt auf den Build-Prozess auswirkt, kannst du sie an einer beliebigen Stelle in der Datei platzieren. Die meisten Programmierer neigen jedoch dazu, den Befehl ENTRYPOINT an das Ende der Datei zu setzen.

Shell-Form-Syntax

Wenn ENTRYPOINT mit der Shell-Form ausgeführt wird, ruft es eine Befehlsshell zur Verarbeitung auf. Bei dieser Methode werden die Umgebungsvariablen ersetzt, aber die Möglichkeit, Argumente in der exec-Form anzuhängen, wird blockiert:

ENTRYPOINT command param1 param2

Hier ist command der primäre Befehl, der beim Start des Containers ausgeführt wird. param1 und param2 sind Argumente für den Befehl.

Exec-Form-Syntax

Das Exec-Formular ruft keine Befehlsshell auf. Stattdessen führt es den angegebenen Befehl und die Parameter direkt aus. Bei dieser Methode kannst du Argumente über CMD oder die Runtime-Befehlszeile anfügen:

ENTRYPOINT ["executable", "param1", "param2"]

Hier ist executable der primäre Befehl, und param1 und param2 sind Argumente für die ausführbare Datei.

ENTRYPOINT in Aktion

Lass uns einen einfachen ENTRYPOINT Befehl für ein Dockerfile zusammenstellen, um zu sehen, wie er funktioniert. Du kannst ihn nicht testen, ohne deinen Container zu starten, denn der Befehl wird zur Laufzeit ausgeführt, nicht zur Bauzeit.

Hier ist ein Beispiel in Form von exec:

ENTRYPOINT ["python", "app.py"]

Wenn dieser Container startet, startet er einen Python-Interpreter und führt das Skript app.py aus, das als Standardverhalten deines Containers dient.

Um dieses Beispiel mit dem Shell-Formular zu wiederholen, musst du eine kleine Änderung vornehmen:

ENTRYPOINT python app.py

In diesem Beispiel wird der Python-Interpreter über einen Shell-Befehl gestartet, anstatt ihn direkt auszuführen.

ENTRYPOINT mit CMD

Bei CMD handelt es sich um eine Dockerfile-Anweisung, die die Standardargumente für einen ausführenden Container enthält. Diese können die Form eines ausführbaren Befehls haben oder als zusätzliche Parameter für die Anweisung ENTRYPOINT dienen. Beim Start eines Containers kannst du diese Parameter außer Kraft setzen, indem du dem Befehl docker run Argumente mitgibst.

Wie ENTRYPOINT kannst du auch CMD entweder in Form eines ausführbaren Befehls oder einer Shell schreiben. Der Hauptunterschied besteht darin, dass CMD Standardbefehle oder -parameter festlegt, die du in der Befehlszeile überschreiben kannst. ENTRYPOINT hingegen konfiguriert Container so, dass sie als ausführbare Dateien ausgeführt werden, was bedeutet, dass du den Befehl nicht von der Kommandozeile aus überschreiben kannst.

Mit CMD kannst du die Funktionen von ENTRYPOINTerweitern, um deinem Image mehr Flexibilität zu verleihen. Wenn du die beiden kombinierst, kannst du das Verhalten deines Images anpassen, wobei die CMD Werte als Standardargumente für die ENTRYPOINT Anweisung dienen. Mit dieser Methode kannst du einen Standardbefehl über ENTRYPOINT und Standardargumente über CMD festlegen.

Anders als bei der Verwendung von ENTRYPOINT allein, kannst du bei dieser Methode die Parameter überschreiben, die beim Befehl docker run übergeben werden.

Um das obige Beispiel noch flexibler zu gestalten, kannst du einen CMD Befehl einfügen:

ENTRYPOINT ["python", "app.py"]
CMD ["--help"]

In diesem Beispiel bedeutet das Starten eines Docker-Containers ohne Angabe von Kommandozeilenargumenten, dass python app.py --help standardmäßig ausgeführt wird. Wenn du jedoch beim Starten des Containers Argumente angibst (z. B. docker run <image> --version), werden die Standardargumente von CMD ersetzt, was zu python app.py --version führt. Dieser Ansatz gibt dir mehr Flexibilität bei der Ausführung deiner Container.

Anwendungsfälle für ENTRYPOINT in Docker

Der häufigste Anwendungsfall für ENTRYPOINT ist das Einrichten von Images für bestimmte Anwendungen oder Dienste. Wenn du zum Beispiel ein Image für eine Python-Anwendung erstellst, kannst du mit ENTRYPOINT festlegen, dass der Python-Interpreter ausgeführt werden soll.

Du kannst ENTRYPOINT auch verwenden, um Docker-Images für Continuous Integration und Continuous Deployment (CI/CD) Pipelines zu erstellen. Mit diesen Abbildern kannst du die für jede Phase benötigte Umgebung kapseln, um Konsistenz zu gewährleisten. Du kannst zum Beispiel ein Docker-Image erstellen, dessen ENTRYPOINT auf ein Testskript eingestellt ist. Dieses Image führt die Tests automatisch aus, wenn es ausgeführt wird, um eine konsistente, wiederholbare Testumgebung zu schaffen.

ENTRYPOINT ist auch für das Debugging von containerisierten Anwendungen nützlich. Wenn du eine Shell-Sitzung mit ENTRYPOINT startest, kannst du mit der Anwendungsumgebung innerhalb des Containers interagieren. Diese Interaktionen umfassen das Ausführen von Befehlen, das Durchsuchen von Dateien und das Überprüfen des Zustands der Anwendung. Sobald du das Problem behoben hast, kannst du das Docker-Image mit dem entsprechenden ENTRYPOINT neu erstellen, um die Anwendung auszuführen.

Wie man ENTRYPOINT überschreibt

Es ist möglich, die ENTRYPOINT eines Docker-Images zur Laufzeit zu überschreiben, um noch flexibler zu sein. Dazu musst du im Befehl docker run nach dem Image-Namen einen Befehl angeben.

Wenn dein Image zum Beispiel ein Python-Skript als ENTRYPOINT hat, du aber stattdessen eine Shell innerhalb des Containers öffnen möchtest, kannst du Folgendes ausführen:

docker run --entrypoint <image> “/bin/bash”

Dieses Skript setzt die Standardeinstellungen der Anwendung ENTRYPOINT außer Kraft und startet eine Bash-Shell.

Wenn du ein anderes Python-Skript ausführen möchtest, kannst du dieses Skript ebenfalls als Befehl angeben. Diese Taktik gibt dir die Flexibilität, deinen Container mit anderen Parametern zu starten, als die, die ursprünglich im ENTRYPOINT deines Dockerfiles angegeben waren.

Best Practices für die Verwendung von ENTRYPOINT in Docker

Da ENTRYPOINT ein so wichtiger Befehl für Docker ist, ist es wichtig, dass du die folgenden Best Practices befolgst, um ihn optimal nutzen zu können.

Konzentriere dich bei Containern auf eine einzige Aufgabe

ENTRYPOINT legt die Verantwortlichkeiten deines Docker-Containers fest. Wie bei Microservices sollte sich jeder Container auf eine einzige Aufgabe, einen Dienst oder einen Teil einer Anwendung konzentrieren. Dieser Ansatz erhöht die Modularität und Skalierbarkeit deiner Anwendung und macht es einfacher, sie zu entwickeln, zu testen und zu warten.

Sicherstellen, dass die ENTRYPOINT-Skripte ausführbar und richtig formatiert sind

Wenn die ENTRYPOINT Skripte ausführbar und richtig formatiert sind, können Probleme wie Syntax- und Berechtigungsfehler vermieden werden.

Um sicherzustellen, dass die ENTRYPOINT Skripte ausführbar sind, kannst du die folgende RUN chmod +x Anweisung verwenden:

COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

In diesem Beispiel wird das Skript entrypoint.sh in den Container kopiert und mit der Anweisung RUN chmod +x ausführbar gemacht. Anschließend wird die ENTRYPOINT definiert, um das Skript entrypoint.sh zu verwenden.

Du kannst auch einen Linter wie ShellCheck verwenden, um die Syntax und den Stil der Skripte zu überprüfen und die richtige Formatierung sicherzustellen.

Vermeide es, Werte in ENTRYPOINT-Skripten fest zu kodieren

Wenn du Umgebungsvariablen oder Befehlszeilenargumente verwendest, anstatt Werte fest zu kodieren, kannst du deine Skripte flexibler gestalten. Außerdem kannst du so den Dateipfad von außerhalb des Containers konfigurieren.

Anstatt den Dateipfad im Skript ENTRYPOINT fest zu kodieren, könntest du zum Beispiel wie folgt vorgehen:

#!/bin/bash
echo "Starting my application..."
./my-app -f /path/to/my/file.txt

Du kannst eine Variable wie diese verwenden:

#!/bin/bash
echo "Starting my application..."
./my-app -f "${MY_FILE}"

Durch die Verwendung von Variablen kannst du dein Image im Handumdrehen anpassen, ohne dein Dockerfile neu schreiben zu müssen.

Docker und Kinsta arbeiten zusammen

Kinsta bietet eine leistungsstarke, flexible Plattform für die Bereitstellung von Webanwendungen mit Docker. Sie hilft dir, benutzerdefinierte Docker-Images zu erstellen und bereitzustellen, damit du mehr Kontrolle und Flexibilität über deine Hosting-Umgebung hast.

Egal, ob du eine benutzerdefinierte Hosting-Umgebung aufbaust oder deine Anwendung skalierst, um mehr Datenverkehr zu bewältigen, Kinsta bietet dir die Werkzeuge und den Support, den du für deinen Erfolg brauchst.

Zusammenfassung

ENTRYPOINT ist ein wichtiges Werkzeug für die Konfiguration von Docker-Containern. Es legt den Standardbefehl fest, der ausgeführt wird, wenn ein Container aus einem Image startet, und definiert damit seine Hauptfunktion. Du kannst ENTRYPOINT verwenden, um bestimmte Anwendungen auszuführen, in CI/CD-Pipelines zu helfen oder mit CMD zu kombinieren, um das Verhalten von Containern flexibler zu gestalten.

Docker ist derzeit das beliebteste Entwicklertool und damit entscheidend für verschiedene containerisierte Implementierungen. Wenn du mehr über Docker erfahren möchtest, stöbere in den Artikeln von Kinsta und schau dir Kinsta für das Hosting deiner containerisierten Anwendungen an.

Kinsta macht deinen Entwicklungsworkflow einfacher und effizienter. Funktionen wie containerisierte Anwendungen auf einer GCP-Infrastruktur, die auf C2-Maschinen mit 37 Rechenzentren läuft, die Premium-Integration mit Cloudflare für ein hochleistungsfähiges CDN, das deine Website von 260+ Points of Presence (PoPs) aus bedient, DDoS-Schutz auf Unternehmensebene durch Firewalls, Edge Caching und Überwachung der Betriebszeit (mit 99% Betriebszeitgarantie) sorgen dafür, dass deine Anwendung schnell und sicher läuft und zuverlässig im Internet verfügbar ist.

Marcia Ramos Kinsta

Ik ben de Editorial Team Lead bij Kinsta. Ik ben een open source liefhebber en ik houd van coderen. Met meer dan 7 jaar ervaring in technisch schrijven en redactiewerk voor de tech-industrie, werk ik graag samen met mensen om duidelijke en beknopte content te creëren en workflows te verbeteren.