Verwendung von ENTRYPOINT vs. CMD in Dockerfile
In Docker gibt es zwei Anweisungen, um anzugeben, welcher Befehl beim Start eines Containers ausgeführt werden soll: CMD
und ENTRYPOINT
. Sie haben unterschiedliche Zwecke und Verhaltensweisen, und das Verständnis des Unterschieds ist wichtig für die Containerverwaltung.
Verstehen von ENTRYPOINT und CMD
ENTRYPOINT
: Definiert die ausführbare Datei, die beim Start des Containers ausgeführt wird. Es ist schwieriger, sie zur Laufzeit zu überschreiben.
CMD
: Stellt Standardargumente für den ENTRYPOINT
bereit oder kann den gesamten Befehl angeben, wenn ENTRYPOINT
nicht verwendet wird. Es ist einfach, sie zur Laufzeit zu überschreiben.
Lassen Sie uns den Unterschied untersuchen, indem wir zwei verschiedene Dockerfiles erstellen.
Erstellen Sie zuerst ein neues Python-Skript, das Befehlszeilenargumente akzeptiert:
nano greeting.py
Fügen Sie den folgenden Code hinzu:
import sys
print("Script started!")
if len(sys.argv) > 1:
print(f"Arguments provided: {sys.argv[1:]}")
for arg in sys.argv[1:]:
print(f"- {arg}")
else:
print("No arguments provided.")
print("Script finished!")
Speichern und beenden Sie Nano.
Erstellen wir nun ein Dockerfile, das CMD
verwendet:
nano Dockerfile.cmd
Fügen Sie den folgenden Inhalt hinzu:
FROM python:3.9-slim
WORKDIR /app
COPY greeting.py .
CMD ["python", "greeting.py", "default", "arguments"]
Speichern und beenden Sie Nano.
Erstellen Sie das Image:
docker build -t python-cmd -f Dockerfile.cmd .
Erstellen Sie nun ein weiteres Dockerfile, das ENTRYPOINT
verwendet:
nano Dockerfile.entrypoint
Fügen Sie den folgenden Inhalt hinzu:
FROM python:3.9-slim
WORKDIR /app
COPY greeting.py .
ENTRYPOINT ["python", "greeting.py"]
CMD ["default", "arguments"]
Speichern und beenden Sie Nano.
Erstellen Sie das Image:
docker build -t python-entrypoint -f Dockerfile.entrypoint .
Testen von CMD vs. ENTRYPOINT
Lassen Sie uns Container von beiden Images ausführen und die Unterschiede beobachten.
Führen Sie zuerst einen Container mit dem CMD
-Image ohne zusätzliche Argumente aus:
docker run --name cmd-container python-cmd
Die Ausgabe sollte ähnlich sein wie:
Script started!
Arguments provided: ['default', 'arguments']
- default
- arguments
Script finished!
Führen Sie nun einen Container mit dem CMD
-Image aus, aber geben Sie benutzerdefinierte Argumente an:
docker run --name cmd-container-custom python-cmd hello world
Ausgabe:
Script started!
No arguments provided.
Script finished!
Beachten Sie, dass der gesamte Befehl durch hello world
ersetzt wurde, die nicht als Argumente an unser Skript übergeben werden.
Führen wir nun einen Container mit dem ENTRYPOINT
-Image ohne zusätzliche Argumente aus:
docker run --name entrypoint-container python-entrypoint
Ausgabe:
Script started!
Arguments provided: ['default', 'arguments']
- default
- arguments
Script finished!
Führen Sie abschließend einen Container mit dem ENTRYPOINT
-Image aus und geben Sie benutzerdefinierte Argumente an:
docker run --name entrypoint-container-custom python-entrypoint hello world
Ausgabe:
Script started!
Arguments provided: ['hello', 'world']
- hello
- world
Script finished!
Dieses Mal werden unsere Argumente ordnungsgemäß an das Python-Skript übergeben, da ENTRYPOINT
die ausführbare Datei definiert und alle zusätzlichen Argumente, die an docker run
übergeben werden, an diese ausführbare Datei übergeben werden.
Best Practices
- Verwenden Sie
ENTRYPOINT
für Container, die immer einen bestimmten Befehl ausführen sollen (wie unser Python-Skript).
- Verwenden Sie
CMD
, um Standardargumente bereitzustellen, die leicht überschrieben werden können.
- Kombinieren Sie beides, indem Sie
ENTRYPOINT
für den Befehl und CMD
für Standardargumente verwenden.
Bereinigen Sie die Container:
docker rm cmd-container cmd-container-custom entrypoint-container entrypoint-container-custom
Sie haben nun den Unterschied zwischen CMD
und ENTRYPOINT
in Docker gelernt, was für die Steuerung der Ausführung Ihrer Python-Skripte beim Start eines Containers unerlässlich ist.