Detaillierte Erklärung des Unterschieds zwischen run/cmd/entrypoint in Docker

Detaillierte Erklärung des Unterschieds zwischen run/cmd/entrypoint in Docker

In Dockerfile können run, cmd und entrypoint zum Ausführen von Befehlen verwendet werden. Hier sind ihre Hauptverwendungen:

  • Der Befehl „run“ führt Befehle aus und erstellt eine neue Image-Ebene, die normalerweise zum Installieren von Softwarepaketen verwendet wird.
  • Der Befehl cmd legt den Standardbefehl und seine Parameter fest, die nach dem Start des Containers ausgeführt werden sollen. Der von CMD festgelegte Befehl kann jedoch durch die Befehlszeilenparameter nach dem Befehl docker run ersetzt werden.
  • Der beim Starten des Containers auszuführende Entrypoint-Konfigurationsbefehl wird nicht ignoriert und ausgeführt, auch wenn beim Ausführen docker run andere Befehle angegeben werden.

Ausführen von Befehlen im Shell- und Exec-Format

Wir können die von „run“, „cmd“ und „entrypoint“ auszuführenden Befehle in den folgenden zwei Formaten angeben:

  • Shell-Format: . Beispiel: yum install -y wget
  • Exec-Format: ["ausführbare Datei", "Param1", "Param2", …]. Zum Beispiel: [„yum“, „install“, „-y“, „wget“]

Es wird empfohlen, für cmd und Entrypoint das Exec-Format zu verwenden, da die Anweisungen besser lesbar und leichter verständlich sind, während für „run“ beide Formate akzeptabel sind.

Fallstricke beim Exec-Format

Der Inhalt der Docker-Datei ist wie folgt:

Umgebungsname Morris

Einstiegspunkt ["echo", "$name"]

Diese Schreibweise gibt nur „$name“ aus und ersetzt die Variable nicht, da nur der Echo-Befehl und nicht die Shell ausgeführt wird. Dies bedeutet, dass wir echo nicht in der Shell ausführen, sondern einfach echo ausführen, sodass die Variable nicht ersetzt wird.

Um es in eine ausführbare Shell umzuwandeln, müssen Sie es in die folgende Form umschreiben

Umgebungsname Morris

Einstiegspunkt ["/bin/bash", "-c", "echo $name"]

Befehl ausführen

Der Befehl „Ausführen“ wird häufig zum Installieren von Anwendungen und Softwarepaketen verwendet. „run“ führt den Befehl über dem aktuellen Bild aus und erstellt eine neue Bildebene. Dockerfile enthält oft mehrere Ausführungsanweisungen. Hier ist ein Beispiel:

Führen Sie „yum update && yum install -y \“ aus.  
 bzr \
 Lebenslauf \
 git \
 Quecksilber \
 Subversion

yum update und yum install werden in einem Run-Befehl ausgeführt, wodurch sichergestellt wird, dass jedes Mal das neueste Paket installiert wird. Wenn „yum install“ in einem separaten Lauf ausgeführt wird, wird die von „yum update“ erstellte Image-Ebene verwendet, die möglicherweise vor langer Zeit zwischengespeichert wurde.

cmd-Befehl

Mit der cmd-Direktive kann der Benutzer den vom Container ausgeführten Standardbefehl angeben. Dieser Befehl wird ausgeführt, wenn der Container gestartet wird und mit „docker run“ kein anderer Befehl angegeben ist. Hier ist ein Beispiel:

cmd echo "Hallo Welt"

Beim Ausführen des Containers docker run -it [image] wird folgende Ausgabe ausgegeben:

Hallo Welt

Wenn jedoch danach ein Befehl hinzugefügt wird, etwa docker run -it [image] echo hi , wird cmd ignoriert und der Befehl echo hi ausgeführt:

Hi

Wenn mehrere cmd-Befehle vorhanden sind, wird nur der letzte cmd-Befehl ausgeführt.

Entrypoint-Befehl

Das Exec-Format des Einstiegspunkts wird verwendet, um den Befehl und seine Parameter festzulegen, die beim Starten des Containers ausgeführt werden sollen. Zusätzliche Parameter können über den Befehl cmd oder Befehlszeilenparameter bereitgestellt werden. Im Gegensatz zum cmd-Befehl werden immer die Parameter im Entrypoint verwendet. Hier ist ein Beispiel:

Einstiegspunkt ["Echo", "Hallo"]

Wenn der Container über docker run -it [image] gestartet wird, ist die Ausgabe:

Hallo

Wenn es mit docker run -it [image] morris gestartet wird, ist die Ausgabe:

Hallo Morris

Schauen wir uns ein weiteres Beispiel an. Das Dockerfile ist:

Einstiegspunkt ["Echo", "Hallo"]
cmd ["Welt"]

Wenn der Container über docker run -it [image] gestartet wird, ist die Ausgabe:

Hallo Welt

Wenn Sie es mit docker run -it [image] morris starten, ist die Ausgabe:

Hallo Morris

Die Parameter im Einstiegspunkt werden immer verwendet, während die zusätzlichen Parameter von cmd beim Starten des Containers dynamisch ersetzt werden können.

Wenn mehrere Einstiegspunktbefehle vorhanden sind, wird entsprechend nur der letzte Einstiegspunktbefehl ausgeführt.

Zusammenfassen

  • Verwenden Sie den Befehl „Ausführen“, um Anwendungen und Softwarepakete zu installieren und Images zu erstellen.
  • Wenn der Zweck des Docker-Image darin besteht, eine Anwendung oder einen Dienst auszuführen, z. B. MySQL, sollte zuerst die Entrypoint-Anweisung im Exec-Format verwendet werden. cmd kann zusätzliche Standardparameter für den Einstiegspunkt bereitstellen und die Standardparameter können durch die Docker-Run-Befehlszeile ersetzt werden.
  • Wenn Sie einen Standardstartbefehl für den Container festlegen möchten, verwenden Sie den Befehl cmd. Benutzer können diesen Standardbefehl in der Docker-Run-Befehlszeile ersetzen.

Dies ist das Ende dieses Artikels über die Unterschiede zwischen run/cmd/entrypoint in Docker. Weitere relevante Inhalte zu Docker run/cmd/entrypoint finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Lösung für das Problem, dass Docker CMD/ENTRYPOINT das sh-Skript ausführt: nicht gefunden/run.sh:
  • Führen Sie nach dem Docker-Ausführen mehrere Befehle aus
  • Ubuntu vps installiert Docker und meldet einen Fehler: Es kann keine Verbindung zum Docker-Daemon unter unix:///var/run/docker.sock hergestellt werden. Problem gelöst
  • Docker verwendet CMD- oder ENTRYPOINT-Befehle, um mehrere Dienste gleichzeitig zu starten
  • Detaillierte Erklärung der CMD- und ENTRYPOINT-Befehle im Dockerfile

<<:  Zusammenfassung der drei Phasen der Entwicklung eines visuellen Designers

>>:  Detaillierte Erklärung des MySQL-Datenbank-LIKE-Operators in Python

Artikel empfehlen

Detaillierte Erklärung von MySQL-Transaktionen und MySQL-Protokollen

Transaktionale Merkmale 1. Atomarität: Nach dem S...

Anwendung von CSS3-Animationseffekten in Aktivitätsseiten

Hintergrund Ehe wir uns versehen, neigt sich ein ...

Der Unterschied zwischen z-index: 0 und z-index: auto in CSS

Ich habe vor Kurzem etwas über Stapelkontexte gel...

Vue implementiert einen Countdown zwischen angegebenen Daten

In diesem Artikelbeispiel wird der spezifische Co...

Implementierungsmethode und Beispielcode des Tomcat-Klassenladers

Tomcat definiert intern mehrere ClassLoader, soda...

Überlegungen zur Partitionierung von MySQL-Datenbanktabellen [empfohlen]

Die Tabellenpartitionierung unterscheidet sich vo...

Abfrage der Daten des Tages vor dem aktuellen Zeitintervall in MySQL

1. Hintergrund In tatsächlichen Projekten stoßen ...

So fügen Sie CentOS7 systemd benutzerdefinierte Systemdienste hinzu

systemd: Das Service-Systemctl-Skript von CentOS ...

Eine kurze Diskussion über die Anpassung mobiler Endgeräte

Vorwort Beim Schreiben von Front-End-Code kommt m...

MySQL Online-DDL-Tool Gh-Ost-Prinzipanalyse

Inhaltsverzeichnis 1. Einleitung 1.1 Grundsatz 1....

Hinweise zur Zeitverwaltung des Linux-Kernel-Gerätetreibers

/****************** * Zeitverwaltung des Linux-Ke...

CSS: besuchte geheime Erinnerungen des Pseudoklassenselektors

Gestern wollte ich a:visited verwenden, um die Fa...