GNU/Linux >> LINUX-Kenntnisse >  >> Ubuntu

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

Einführung

Container sind für die Ausführung bestimmter Aufgaben und Prozesse konzipiert , nicht zum Hosten von Betriebssystemen. Sie erstellen einen Container, um eine einzelne Einheitsaufgabe zu erfüllen. Sobald es die gegebene Aufgabe abgeschlossen hat, stoppt es . Daher hängt der Lebenszyklus des Containers von den laufenden Prozessen in ihm ab. Sobald der Prozess stoppt, stoppt auch der Container.

Ein Dockerfile definiert diesen Prozess. Es ist ein Skript, das aus Anweisungen zum Erstellen eines Docker-Images besteht. In diesem Skript gibt es zwei Arten von Anweisungen die den im Container ausgeführten Prozess definieren kann:

  • Einstiegspunkt
  • CMD

In diesem Artikel erklären wir die Unterschiede zwischen Docker ENTRYPOINT und CMD und wann man welche Docker-Anweisung verwendet.

Docker Entrypoint vs. CMD:Lösung des Dilemmas

Kurz gesagt, CMD definiert Standardbefehle und/oder Parameter für einen Container. CMD ist eine Anweisung, die am besten zu verwenden ist, wenn Sie einen Standardbefehl benötigen, den Benutzer leicht überschreiben können. Wenn ein Dockerfile mehrere CMDs hat, werden nur die Anweisungen des letzten angewendet.

Andererseits ENTRYPOINT wird bevorzugt, wenn Sie einen Container mit einer bestimmten ausführbaren Datei definieren möchten. Sie können einen ENTRYPOINT beim Starten eines Containers nicht überschreiben, es sei denn, Sie fügen den --entrypoint hinzu Flagge.

Kombinieren Sie ENTRYPOINT mit CMD wenn Sie einen Container mit einer bestimmten ausführbaren Datei und einem Standardparameter benötigen, der einfach geändert werden kann. Wenn Sie beispielsweise eine Anwendung containerisieren, verwenden Sie ENTRYPOINT und CMD um umgebungsspezifische Variablen zu setzen.

Shell- und Exec-Formular

Bevor wir beginnen, ist es wichtig, die Formen der Anweisungen zu besprechen. Docker ENTRYPOINT und CMD können zwei Formen haben:

  • Muschelform
  • Formular ausführen

Die Syntax für jeden Befehl in Shell-Form lautet:

<instruction> <command>

Die Syntax für Anweisungen in Exec-Form lautet:

<instruction> ["executable", "parameter"]

Sie können Docker CMD/ENTRYPOINT-Anweisungen in beiden Formen schreiben:

  • CMD echo "Hello World" (Muschelform)
  • CMD ["echo", "Hello World"] (Exec-Formular)
  • ENTRYPOINT echo "Hello World" (Muschelform)
  • ENTRYPOINT ["echo", "Hello World"] (Exec-Formular)

Versuchen Sie jedoch, alle Ihre Anweisungen in exec-Form zu halten um mögliche Leistungsprobleme zu vermeiden.

Docker-CMD

Docker-CMD definiert die ausführbare Standarddatei eines Docker-Images. Sie können dieses Image als Basis eines Containers ausführen, ohne Befehlszeilenargumente hinzuzufügen. In diesem Fall führt der Container den durch den CMD-Befehl angegebenen Prozess aus.

Die CMD-Anweisung wird nur verwendet, wenn dem run kein Argument hinzugefügt wird Befehl beim Starten eines Containers. Wenn Sie dem Befehl also ein Argument hinzufügen, überschreiben Sie die CMD.

Um Ihnen zu zeigen, wie CMD funktioniert, erstellen wir einen Beispielcontainer mit einer CMD-Anweisung.

Erstellen einer Dockerdatei mit CMD und Erstellen eines Images

1. Erstellen Sie zunächst ein neues MyDockerImage Ordner zum Speichern Ihrer Bilder in:

sudo mkdir MyDockerImage

2. Wechseln Sie in diesen Ordner und erstellen Sie ein neues Dockerfile:

cd MyDockerImage
sudo touch Dockerfile

3. Öffnen Sie das Dockerfile mit Ihrem bevorzugten Texteditor:

nano Dockerfile

4. Fügen Sie der Datei dann folgenden Inhalt hinzu:

FROM ubuntu
MAINTAINER sofija
RUN apt-get update
CMD ["echo", "Hello World"]

Im obigen Inhalt können Sie sehen, dass wir die CMD-Anweisung verwendet haben, um die Nachricht Hello World wiederzugeben wenn der Container ohne einen bestimmten Befehl gestartet wird.

5. Speichern und beenden die Datei.

6. Der nächste Schritt besteht darin, ein Docker-Image aus dem neu erstellten Dockerfile zu erstellen. Da wir uns noch im MyDockerImage befinden Verzeichnis müssen Sie den Speicherort der Docker-Datei nicht angeben, erstellen Sie einfach das Image, indem Sie Folgendes ausführen:

sudo docker build .

7. Die Ausgabe teilt Ihnen den Namen des Containers mit. Sie können überprüfen, ob es unter den lokal gespeicherten Bildern verfügbar ist, indem Sie Folgendes ausführen:

sudo docker images

Einen Docker-Container mit CMD ausführen

Um CMD in Aktion zu sehen, erstellen wir einen Container basierend auf dem im vorherigen Schritt erstellten Image.
Führen Sie den Container mit dem Befehl aus:

sudo docker run [image_name]

Da es kein Befehlszeilenargument gibt, führt der Container die standardmäßige CMD-Anweisung aus und zeigt Hello World an Botschaft. Wenn Sie jedoch beim Starten eines Containers ein Argument hinzufügen, überschreibt es die CMD-Anweisung.

Fügen Sie beispielsweise das Hostname-Argument zum Docker-Ausführungsbefehl hinzu:

sudo docker run [image_name] hostname

Docker führt den Container und den hostname aus anstelle des echo-Befehls der CMD. Sie können dies in der Ausgabe sehen.

Docker-Einstiegspunkt

ENTRYPOINT ist die andere Anweisung, die verwendet wird, um zu konfigurieren, wie der Container ausgeführt wird. Genau wie bei CMD müssen Sie einen Befehl und Parameter angeben.

Was ist der Unterschied zwischen CMD und ENTRYPOINT? Sie können die ENTRYPOINT-Anweisung nicht überschreiben, indem Sie Befehlszeilenparameter zum docker run hinzufügen Befehl. Indem Sie sich für diese Anweisung entscheiden, implizieren Sie, dass der Behälter speziell für eine solche Verwendung gebaut wurde.

Lesen Sie weiter, um zu sehen, wie wir ENTRYPOINT bei der Containererstellung anwenden.

Erstellen einer Dockerdatei mit ENTRYPOINT und Erstellen eines Images

1. Verwenden Sie die im CMD-Abschnitt erstellte Docker-Datei und bearbeiten Sie die Datei, um die Anweisung zu ändern. Öffnen Sie die vorhandene Datei mit einem Texteditor:

sudo nano Dockerfile

2. Bearbeiten Sie den Inhalt, indem Sie den CMD-Befehl durch ENTRYPOINT:

ersetzen
FROM ubuntu
MAINTAINER sofija
RUN apt-get update
ENTRYPOINT ["echo", "Hello World"]

3. Speichern und schließen die Datei.

Einen Docker-Container mit ENTRYPOINT ausführen

1. Erstellen Sie ein neues Image mit dem folgenden Befehl:

sudo docker build .

2. Die Ausgabe sollte zeigen, dass Sie das neue Image erfolgreich unter einem bestimmten Namen erstellt haben. Lassen Sie uns es jetzt als Container ausführen, ohne Befehlszeilenparameter hinzuzufügen:

sudo docker run [container_name]

Die Ausgabe ist die gleiche wie bei CMD. Das liegt daran, dass wir dem run-Befehl keine Argumente hinzugefügt haben.

3. Um zu sehen, wie ENTRYPOINT funktioniert, müssen Sie beim Starten eines Containers einen Parameter hinzufügen. Verwenden Sie denselben Befehl wie im vorherigen Schritt und fügen Sie etwas nach dem Containernamen hinzu:

sudo docker run [container_name] KnowledgeBase

Wie Sie sehen, hat Docker die ursprüngliche Anweisung, Hello World zu wiederholen, nicht außer Kraft gesetzt. Es wurde lediglich der neue Parameter zum bestehenden Befehl hinzugefügt.

Obwohl Sie ENTRYPOINT und CMD in beiden Formen verwenden können, wird allgemein empfohlen, bei der Ausführungsform zu bleiben . Dies ist die zuverlässigere Lösung, da die Schalenform gelegentlich zu subtilen Problemen im Prozess führen kann.

Docker-Einstiegspunkt mit CMD

Wie Sie bisher gesehen haben, sind ENTRYPOINT und CMD ähnlich, aber nicht gleich. Außerdem schließen sich diese beiden Anweisungen nicht gegenseitig aus. Das ist richtig, es ist möglich, beides in Ihrem Dockerfile zu haben.

Es gibt viele Situationen, in denen die Kombination von CMD und ENTRYPOINT die beste Lösung für Ihren Docker-Container wäre. In solchen Fällen wird die ausführbare Datei mit ENTRYPOINT definiert , während CMD den Standardparameter angibt .

Wenn Sie beide Anweisungen verwenden, achten Sie darauf, sie in ausführbarer Form aufzubewahren .

Lesen Sie weiter, um zu sehen, wie ENTRYPOINT und CMD in unserem Beispiel zusammenarbeiten.

Führen Sie einen Container mit Entrypoint und CMD aus

1. Zuerst werden wir unsere vorhandene Dockerfile so ändern, dass sie beide Anweisungen enthält. Öffnen Sie die Datei mit:

sudo nano Dockerfile

2. Die Datei sollte eine ENTRYPOINT-Anweisung enthalten, die die ausführbare Datei angibt, sowie eine CMD-Anweisung, die den Standardparameter definiert, der erscheinen soll, wenn dem Ausführungsbefehl keine weiteren hinzugefügt werden:

FROM ubuntu
MAINTAINER sofija
RUN apt-get update
ENTRYPOINT ["echo", "Hello"]
CMD ["World"]

3. Bauen Sie nun ein neues Image aus dem modifizierten Dockerfile:

sudo docker build . 

4. Testen wir den Container, indem wir ihn ohne Parameter ausführen. Geben Sie den Befehl ein:

sudo docker run [container_name]

Es wird die Nachricht Hello World zurückgegeben . Was passiert jedoch, wenn wir dem docker run-Befehl Parameter hinzufügen?

5. Verwenden Sie denselben Befehl erneut, aber fügen Sie dieses Mal Ihren Namen zum Ausführungsbefehl hinzu:

sudo docker run [container_name] [your_name]

Die Ausgabe hat sich jetzt zu Hello [your_name] geändert (in meinem Fall ist es Hello Sofija ). Dies liegt daran, dass Sie ENTRYPOINT-Anweisungen nicht überschreiben können, während Sie dies mit CMD problemlos tun können.


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

  2. Unterschied zwischen Podman und Docker.

  3. Einige DOCKER-Befehle

  4. Ist der Unterschied zwischen Sudo und Gksu derselbe wie der Unterschied zwischen Sudo -i und Sudo -s?

  5. Der Unterschied zwischen CMD und ENTRYPOINT in Docker-Images

Docker-Image vs. Container:Die Hauptunterschiede

Liste der Docker-Befehle:Cheat Sheet

VPN vs. VDI:Was ist der Unterschied?

Failover vs. Failback:Was ist der Unterschied?

Verwenden der Dockerfile ENTRYPOINT- und CMD-Anweisungen

Docker File vs. Docker Compose:Was ist der Unterschied?