GNU/Linux >> LINUX-Kenntnisse >  >> Panels >> Docker

Der Unterschied zwischen CMD und ENTRYPOINT in Docker-Images

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.


Docker
  1. Was ist der Unterschied zwischen InnoDB und MyISAM?

  2. Was ist der Unterschied zwischen LXC-, LXD- und Docker-Containern?

  3. Was ist der Unterschied zwischen einem Linux-Container und einem Image?

  4. Unterschied zwischen Podman und Docker.

  5. Was ist der Unterschied zwischen Sudo Su – und Sudo Su –?

Docker CMD vs. Entrypoint-Befehle:Was ist der Unterschied?

Der Unterschied zwischen sudo und su erklärt

So aktualisieren Sie das Docker-Image und den Container auf die neueste Version

Verwenden der Dockerfile ENTRYPOINT- und CMD-Anweisungen

So kopieren Sie Dateien zwischen Host und Docker-Container

Was ist der Unterschied zwischen unlink und rm?