Die CMD
und ENTRYPOINT
Anweisungen sind zwei häufig verwechselte Dockerfile
Richtlinien. Beide spielen eine Rolle bei der Bestimmung des Befehls, der ausgeführt wird, wenn der Container gestartet wird.
Die CMD
und ENTRYPOINT
können innerhalb jedes Bildes individuell überschrieben werden. Die effektive Verwendung dieser Anweisungen erleichtert die Verwendung Ihres Containers, indem die Länge der von Ihnen bereitgestellten Befehle verkürzt wird.
Was ist der Einstiegspunkt?
Wir sehen uns ENTRYPOINT
an zuerst, da es vor CMD
verarbeitet wird beim Starten eines neuen Containers. Der Einstiegspunkt des Images definiert den Prozess, der ausgeführt wird, wenn der Container gestartet wird.
Docker setzt den Einstiegspunkt standardmäßig auf /bin/sh -c
. Das bedeutet, dass Sie in einer Shell-Sitzung landen, wenn Sie den Container starten. Für viele Container ist es wünschenswerter, standardmäßig einen anderen Prozessstart zu haben. Sie möchten, dass Headless-Dienste sofort mit ihrer Arbeit beginnen.
Einstellen des ENTRYPOINT
Direktive in einem Dockerfile
weist Docker an, einen bestimmten Befehl auszuführen, wenn der Container gestartet wird. Es wird zum Vordergrundprozess, anstatt zur Standard-Shell-Sitzung.
ENTRYPOINT ["date"]
Ein Container, der mit diesem Dockerfile
erstellt wurde führt das date
aus Befehl. Als date
kein langlebiger Vordergrundprozess ist, wird der Container unmittelbar danach beendet.
Einstiegspunkte müssen ausführbare Binärdateien oder Skripts sein. Ihr Container wird nicht gestartet, wenn Sie einen ungültigen Einstiegspunkt angeben. Wenn Sie ein benutzerdefiniertes Skript verwenden, stellen Sie sicher, dass das ausführbare Bit gesetzt ist. Sie können Ausführungsberechtigungen mit chmod +x my-script.sh
hinzufügen .
Hinzufügen des Befehls (CMD)
Die CMD
Anleitung ist so etwas wie eine Fehlbezeichnung. Es liefert Standardargumente für den durch ENTRYPOINT
definierten Befehl .
ENTRYPOINT ["date"] CMD ["+%A"]
Dieses Beispiel führt dazu, dass der Container date +%A
ausführt . Der +%A
Argument für date
zeigt den aktuellen Wochentag an (z. B. Monday
).
CMD
ist darauf ausgelegt, überschrieben zu werden. docker run
können Sie einen anderen Befehl für eine einzelne Containerinstanz angeben:
docker run my-image +%B
Die Standard-CMD
wird mit +%B
überschrieben , wodurch der Container den Namen des aktuellen Monats anzeigt. Dies funktioniert, weil der Einstiegspunkt des Bildes intakt bleibt. Die CMD
wird immer an den ENTRYPOINT
angehängt , sodass der letzte Befehl zu date +%B
wird .
Sie sollten ENTRYPOINT
verwenden um die primäre ausführbare Datei Ihres Containers zu definieren. Verwenden Sie CMD
um Standardargumente für diese ausführbare Datei zu definieren. Es wird überschrieben, wenn der Container mit anderen Argumenten ausgeführt wird.
Einstiegspunkt-Überschreibungen
Sie können Docker zwingen, ein Image mit einem benutzerdefinierten Einstiegspunkt zu starten. Übergeben Sie den --entrypoint
Flag an docker run
:
docker run --entrypoint /bin/sh my-image
Der im Image des Containers definierte Einstiegspunkt wird zugunsten des von Ihnen angegebenen Befehls ignoriert. In unserem Beispiel wird anstelle des date
eine Shell-Session gestartet Befehl.
Das Überschreiben von Einstiegspunkten sollte selten vorkommen. Es kann den Absichten des Bildautors zuwiderlaufen. Das Festlegen eines benutzerdefinierten Einstiegspunkts kann jedoch nützlich sein, insbesondere beim Debuggen. Wenn sich ein Container schlecht verhält, kann Ihnen das Überschreiben seines Einstiegspunkts Shell-Zugriff gewähren, den Sie sonst nicht erhalten könnten.
Welches soll verwendet werden?
Wenn Sie ein Bildautor sind, sollten Sie ENTRYPOINT
verwenden beim Definieren, was Ihr Container ausführen soll. Wenn Sie Standardargumente bereitstellen möchten, aber erwarten, dass der Benutzer sie überschreibt, fügen Sie CMD
hinzu auch.
Als Bildbenutzer können Sie sich normalerweise daran halten, CMD
zu überschreiben . docker run
hat transparente Unterstützung für Befehlsüberschreibungen. Alle nach dem Bildnamen angegebenen Argumente werden als CMD
interpretiert String für den Container.
Einstiegspunktmodi:Shell oder Exec
Docker unterstützt tatsächlich zwei verschiedene Formen von ENTRYPOINT
:Exec-Modus und Shell-Modus. Der Exec-Modus ist durch die Verwendung eines Array-Konstrukts zur Angabe von Parametern gekennzeichnet. Im Shell-Modus wird der Befehl als eine Zeichenfolge angegeben.
# exec mode ENTRYPOINT ["binary", "--param", "--another-param"] # shell mode ENTRYPOINT binary --param --another-param
Die Verwendung des Shell-Modus bewirkt, dass Ihre Binärdatei als Unterprozess von /bin/sh -c
ausgeführt wird . Dies gibt Ihrem Einstiegspunkt Zugriff auf Umgebungsvariablen, die von der Shell definiert werden.
Der Shell-Modus hat jedoch Kompromisse. Sie können CMD
nicht verwenden Benutzer können also keine Überschreibungen vornehmen. An docker run
übergebene Argumente wird ignoriert; Ihr Container wird den Einstiegspunkt immer so verwenden, wie er ist.
Da Ihre Binärdatei in einer Shell ausgeführt wird, können Docker-Lebenszyklusbefehle wie docker stop
kann unregelmäßig oder gar nicht funktionieren. Docker signalisiert der Shell zu stoppen, anstatt den Prozess innerhalb. Sie können Ihren Prozess mit exec
starten um dies zu vermeiden.
ENTRYPOINT exec binary --param --another-param
Vorteile des Docker-Entrypoint-Ansatzes
Das Trennen des Einstiegspunkts von seinen Argumenten hilft Ihnen, die Komplexität in Ihren Containern zu verbergen. Dies ist am vorteilhaftesten, wenn Sie Utility-Container erstellen, um CLI-Programme zu kapseln.
Legen Sie die Binärdatei Ihrer CLI als Einstiegspunkt für das Image fest. Dadurch können Benutzer interagieren, ohne den Binärnamen in jedem Befehl zu wiederholen.
Überlegen Sie, ob wir die obige Dockerfile
gepackt haben als date:latest
:
# default entrypoint (/bin/sh -c) docker run date:latest date +%A # with `date` as the entrypoint docker run date:latest +%A`
Das Festlegen eines benutzerdefinierten Einstiegspunkts verkürzt Befehle und reduziert Wiederholungen. Der Container wird spezialisierter, indem date
aufgerufen wird automatisch. Dies schafft eine freundlichere Benutzeroberfläche für Ihre Benutzer.
Zusammenfassung
ENTRYPOINT
von Docker und CMD
Anweisungen sind eine häufige Quelle der Verwirrung. Ihre Benennung verschleiert ihren beabsichtigten Zweck.
Verwenden Sie ENTRYPOINT
um den „Befehl“ festzulegen, der ausgeführt wird, wenn neue Container gestartet werden. Sie können Standardargumente mit CMD
definieren . ENTRYPOINT
und CMD
werden kombiniert, um die endgültige Befehlszeichenfolge des Containers zu erzeugen.
Wenn Sie docker run
verwenden , ersetzt Docker die standardmäßige CMD
des Images mit den von Ihnen angegebenen Argumenten. Wenn Sie den Einstiegspunkt eines Bildes überschreiben müssen, verwenden Sie --entrypoint
Flagge.