Die Kombination und der Unterschied zwischen ENTRYPOINT und CMD im Dockerfile

Die Kombination und der Unterschied zwischen ENTRYPOINT und CMD im Dockerfile

Im vorherigen Artikel [Detaillierte Erläuterung von Dockerfile für Docker-Container] haben wir ein umfassenderes Verständnis von Dockerfile erhalten. Wir haben auch erwähnt, dass sowohl `ENTRYPOINT` als auch `CMD` den Container-Startbefehl angeben können. Da diese beiden Befehle für die Beherrschung des Schreibens von Docker-Dateien von zentraler Bedeutung sind, werden sie hier separat erläutert.

1. Schreiben Sie vor

Im vorherigen Artikel haben wir ein umfassendes Verständnis von Dockerfile. Wir haben auch erwähnt, dass ENTRYPOINT und CMD den Container-Startbefehl angeben können. Da diese beiden Befehle für die Beherrschung des Schreibens von Docker-Dateien von zentraler Bedeutung sind, werden sie hier separat erläutert.

2. Der Hauptunterschied zwischen CMD und ENTRYPOINT

Kommen wir gleich zur Sache. Sowohl CMD als auch ENTRYPOINT werden verwendet, um den Befehl zum Starten der Containerausführung anzugeben. Der Unterschied ist:

  • Wenn der Docker-Run-Befehl Argumente enthält, ignoriert der Daemon den CMD-Befehl.
  • Die Verwendung der ENTRYPOINT-Anweisung wird nicht ignoriert und erhält die an die Befehlszeile angehängten Docker-Run-Parameter.

Damit der erstellte Container normal gestartet wird, muss die von uns geschriebene Dockerfile-Datei eine CMD- oder ENTRYPOINT-Anweisung enthalten.

3. Kombination aus CMD und ENTRYPOINT

1.CMD

CMD -Befehl hat drei Formen:

  1. CMD ["executable","param1","param2"] ( Exec -Form, die bevorzugte Form)
  2. CMD ["param1","param2"] (als Standardparameter von ENTRYPOINT )
  3. CMD command param1 param2 (Shell-Format)

Wenn die Docker-Datei mehrere CMDs enthält, wird nur die letzte geladen und verwendet.

Wir suchen in Dockerhub nach dem offiziellen CentOS-Image und werfen einen Blick auf die offizielle Dockerfile-Datei.

Grundsätzlich stellt uns jedes offizielle Image den Dockerfile-Link seiner eigenen Version wie folgt zur Verfügung:

Schauen wir uns das Dockerfile des latest Tags an.

VON Grund auf
HINZUFÜGEN centos-8-x86_64.tar.xz /
LABEL org.label-schema.schema-version="1.0" org.label-schema.name="CentOS-Basisimage" org.label-schema.vendor="CentOS" org.label-schema.license="GPLv2" org.label-schema.build-date="20201204"
CMD ["/bin/bash"]

Es gibt nur vier Zeilen, die den gesamten Inhalt der Docker-Datei darstellen, um eine latest Version des Centos8.3.2011 -Image zu erstellen. Geben Sie das Basisimage an (hier beginnen wir mit dem leeren Image), fügen Sie den Rootfs-Inhalt hinzu, fügen Sie eine Bezeichnung hinzu und geben Sie den Startbefehl über CMD an.

Nicht nur CentOS, sondern auch andere Debian-, Ubuntu-, Busybox- und andere Images müssen den Startbefehl nur über CMD angeben. Beispielsweise ist busybox prägnanter:

VON Grund auf
HINZUFÜGEN busybox.tar.xz /
CMD ["sch"]

Um diese Art von Basis- und Tool-Images zu erstellen, müssen wir nur ein erforderliches CMD angeben, um den Container zu starten. Aber wir schreiben kein Dockerfile, nur um einen Container zu starten. Meistens wollen wir unsere App und unseren Dienst im Container ausführen.

Natürlich kann es auch über CMD gestartet werden, aber dabei gibt es einen Fehler. Der oben erwähnte CMD-Startbefehl wird durch den Docker-Run-Parameter ersetzt.

Wir haben das folgende Dockerfile

[root@localhost Dockerfiles]# cat Dockerfile 
VON centos
CMD ["/bin/top","-b"]

Nach dem Erstellen starten Sie den Container mit dem Parameter ps.

[root@localhost Dockerfiles]# docker run -it centos_top:v1 ps
  PID TTY ZEIT CMD
    1 Punkte/0 00:00:00 Punkte

Sie können sehen, dass nach dem Starten des Containers top -b durch ps ersetzt wurde und der Parameteraustausch nicht erreicht wurde. Das ist offensichtlich nicht das, was wir wollen. Gibt es eine Möglichkeit, die Anwendung standardmäßig zu starten und in die Docker-Run-Parameter zu laden? Das ist die Magie von ENTRYPOINT und CMD.

2. ENTRYPOINT kombiniert mit CMD

Exec- und Shell-Formulare von ENTRYPOINT :

  • ENTRYPOINT ["executable", "param1", "param2"]
  • ENTRYPOINT command param1 param2

Wie oben erwähnt CMD ["param1","param2"] als ENTRYPOINT-Parameter verwendet werden. Gleichzeitig kann der durch ENTRYPOINT angegebene Befehl nicht durch Docker-Run-Parameter ersetzt werden. Wenn wir die beiden Anweisungen CMD und ENTRYPOINT kombinieren, können wir die Docker-Run-Parameter über CMD empfangen und die Parameter dann zur Ausführung an ENTRYPOINT übergeben.

Wir nehmen das offizielle Nginx Dockerfile neueste Version 1.21 als Beispiel

Schauen wir uns zunächst Dockerfile an. Hier konzentrieren wir uns nur auf den Startbefehl, wie folgt:

...
KOPIEREN Sie docker-entrypoint.sh /
KOPIEREN 10-listen-on-ipv6-by-default.sh /docker-entrypoint.d
KOPIE 20-envsubst-on-templates.sh /docker-entrypoint.d
KOPIEREN 30-tune-worker-processes.sh /docker-entrypoint.d
EINSTIEGSPUNKT ["/docker-entrypoint.sh"]

AUSSETZEN 80

STOPSIGNAL SIGQUIT

CMD ["nginx", "-g", "Daemon aus;"]

Aus dem Obigen können wir ersehen, dass beim Starten des Nginx-Containers zuerst das Skript docker-entrypoint.sh ausgeführt wird und der Parameter nginx -g "daemon off;" im CMD-Befehl übergeben wird. Das heißt, das Starten des Containers mit Docker Run ohne Hinzufügen von Parametern entspricht der Ausführung des folgenden Skripts mit Standardparametern.

#docker-entrypoint.sh nginx -g "Daemon aus;"

Was passiert, wenn wir mit Docker Run Parameter übergeben?

Ich habe nginx-debug bestanden

#docker run -dt nginx nginx-debug -g "Daemon aus;"

Zu diesem Zeitpunkt entspricht das Starten des Containers der Ausführung des folgenden Skripts und der folgenden Parameter

#docker-entrypoint.sh nginx-debug -g "Daemon aus;"

Schauen wir uns den Container an, den wir über ps gestartet haben

[root@localhost Dockerfiles]# ps -ef|grep nginx
root 6327 6306 0 Aug12 pts/0 00:00:00 nginx: Masterprozess nginx -g Daemon aus;
101 6384 6327 0 Aug12 pts/0 00:00:00 nginx: Arbeitsprozess
101 6385 6327 0 Aug12 pts/0 00:00:00 nginx: Arbeitsprozess
root 16800 16780 3 12:51 pts/0 00:00:00 nginx: Masterprozess nginx-debug -g Daemon aus;
101 16857 16800 0 12:51 pts/0 00:00:00 nginx: Arbeitsprozess
101 16858 16800 0 12:51 pts/0 00:00:00 nginx: Arbeitsprozess

Offensichtlich wurden unsere beiden Container mit den Parametern nginx und nginx-debug erfolgreich gestartet!

Das heißt, der Befehl, den wir über ENTRYPOINT ["/docker-entrypoint.sh"] angegeben haben, wird trotzdem beim Start ausgeführt und kann die Parameter von Docker Run empfangen.

Was ist docker-entrypoint.sh? docker-entrypoint.sh Dies ist ein Vorverarbeitungsskript, das normalerweise zum Filtern von Befehlszeilenparametern oder zum Ausführen von exec verwendet wird, um den Prozess von Container 1 zu starten.

Das Implementieren von Standardbefehlsparametern oder das Empfangen von Docker-Run-Parametern über ENTRYPOINT+CMD ist eine sehr beliebte und nützliche Methode zum Schreiben von Docker-Dateien.

Dies ist das Ende dieses Artikels über die Kombination von ENTRYPOINT und CMD in Dockerfile. Weitere Informationen zu ENTRYPOINT und CMD in Dockerfile finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Die Kombination und der Unterschied zwischen ENTRYPOINT und CMD im Dockerfile
  • Der Unterschied zwischen ENTRYPOINT und CMD in Dockerfile
  • Detaillierte Erläuterung des Dockerfiles zum Erstellen eines benutzerdefinierten Docker-Images und Vergleich der CMD- und ENTRYPOINT-Anweisungen
  • Detaillierte Erklärung der CMD- und ENTRYPOINT-Befehle im Dockerfile

<<:  Lösung zur Konvertierung in Inline-Styles in CSS (css-inline)

>>:  Was ist ein MySQL-Index? Fragen Sie, wenn Sie es nicht verstehen

Artikel empfehlen

Implementierung eines einfachen Rechners mit Javascript

In diesem Artikelbeispiel wird der spezifische Ja...

So konfigurieren Sie die Basic Auth-Anmeldeauthentifizierung in Nginx

Manchmal erstellen wir einen Dateiserver über ngi...

CentOS 6.5 i386 Installation MySQL 5.7.18 ausführliches Tutorial

Die meisten Leute kompilieren MySQL und legen es ...

Spezifische Verwendung von Vues neuem Spielzeug VueUse

Inhaltsverzeichnis Vorwort Was ist VueUse Einfach...

JavaScript implementiert Countdown auf Front-End-Webseite

Verwenden Sie natives JavaScript, um den Countdow...

Beschreibung der Nginx-Zugriffsprotokoll- und Fehlerprotokollparameter

veranschaulichen: Es gibt zwei Haupttypen von Ngi...

Der gesamte Prozess der Optimierung des ersten Ladens einer Vue-Seite

Inhaltsverzeichnis Vorwort 1. Bildoptimierung 2. ...

So verwenden Sie die Baidu Map API im Vue-Projekt

Inhaltsverzeichnis 1. Registrieren Sie ein Konto ...

mysql5.7.21 UTF8-Kodierungsproblem und -Lösung in der Mac-Umgebung

1. Ziel: Ändern Sie den Wert des character_set_se...

Ubuntu MySQL-Version auf 5.7 aktualisiert

Vor einigen Tagen teilte die Bibliothek mit, dass...

Lernen Sie die Grundlagen der JavaScript-DOM-Operationen in einem Artikel

DOM-Konzepte DOM: Dokumentobjektmodell: Das Dokum...