Im Lernprogramm zum Docker-System haben wir gelernt, dass die Verwendung von Dockerfile zum Erstellen eines Docker-Images eine Standardmethode ist. Anhand des Dockerfiles können wir die Details der im Image installierten Komponenten verstehen. Dockerfile besteht im Allgemeinen aus vier Teilen: erstens dem zu erstellenden Basis-Image, zweitens den Informationen des Image-Builders, drittens Anweisungen zum Hinzufügen von Image-Ebenen während des Image-Erstellungsprozesses und viertens dem Programm, das ausgeführt wird, wenn der Container vom Image gestartet wird. Der in diesem Artikel behandelte ENTRYPOINT und CMD gehören zum letzten Teil des Dockerfiles. Diese beiden Dockerfile-Anweisungen werden verwendet, um dem Docker-Hintergrundprogramm mitzuteilen, dass es beim Starten des Images ausgeführt werden soll. Es gibt subtile Unterschiede zwischen den beiden. Im Folgenden werden die beiden Anweisungen im Hinblick auf ihre Ähnlichkeiten und Unterschiede sowie fortgeschrittene Techniken für die gemeinsame Verwendung der beiden Anweisungen ausführlich erläutert. CMD-Befehl Der CMD-Befehl gibt das Programm an, das beim Start des Containers ausgeführt werden soll. Der einfachste Weg zum Starten eines Containers besteht im Allgemeinen darin, mit „Docker Run“ Parameter an den Docker-Befehl zu übergeben.
Das /bin/bash am Ende übergibt tatsächlich Parameter, um dem Container mitzuteilen, dass beim Start eine Shell ausgeführt werden soll. Dieser Vorgang kann durch den CMD-Befehl äquivalent ersetzt werden
Wenn der durch die CMD-Anweisung angegebene Befehl im Dockerfile vorhanden ist, kann der Container daher ohne Übergabe von Parametern gestartet werden.
Die Ausführungswirkung ist stimmig.
Wenn im Docker-File ein Programm angegeben ist, das beim Starten des Containers ausgeführt werden soll, und beim Starten des Containers mit „docker run“ Befehlszeilenparameter verwendet werden, ist die cmd-Anweisung im Docker-File ungültig.
Es wird festgestellt, dass nach dem Starten des Containers keine Shell vorhanden ist. Es wird nur der Prozessstatus im aktuellen Container gedruckt und der Effekt der cmd-Anweisung wird überschrieben. PID TTY ZEIT CMD 1 ? 00:00:00 ps [root@MiWiFi-R3L-srv-Test]# An dieser Stelle können Sie sehen, dass der cmd-Effekt abgedeckt ist. In einem Dockerfile ist nur die letzte cmd-Anweisung gültig, daher sollte nur eine cmd-Anweisung in ein Dockerfile geschrieben werden. ENTRYPOINT-Anweisung Die Wirkung der ENTRYPOINT-Anweisung ist der von CMD sehr ähnlich und die Funktionen der beiden können leicht verwechselt werden. Der größte Unterschied liegt in der Art der Verwendung. Der von ENTRYPOINT angegebene Befehl muss mit dem Befehl „docker run“ verwendet werden, um den Container zu starten. Der Inhalt, der auf die Anweisung „docker run“ folgt, wird als Parameter des durch die Anweisung ENTRYPOINT angegebenen laufenden Befehls verwendet. Der von ENTRYPOINT angegebene Linux-Befehl wird im Allgemeinen nicht überschrieben. Nehmen Sie als Beispiel das Nginx-Image Erstellen Sie zunächst ein Nginx-Image und geben Sie Nginx als das Programm an, das ausgeführt werden soll, wenn der Container läuft. VON centos MAINTAINER-Allokator Führen Sie den Befehl yum install -y nginx aus. RUN echo 'hallo welt' > /usr/share/nginx/html/index.html AUSSETZEN 80 EINSTIEGSPUNKT ["/usr/sbin/nginx"] Starten Sie dann den Spiegel
Die letzten beiden werden als Parameter an das auszuführende nginx-Startprogramm übergeben. Zu diesem Zeitpunkt wird nginx als Vordergrundprogramm ausgeführt und ist ein Webserver. Sie können „Hallo Welt“ normalerweise über den Browser entsprechend dem extern gebundenen Port sehen. Tipps zur gemeinsamen Verwendung beider Nachdem Sie nun den Unterschied zwischen den beiden kennen, können Sie ihre Eigenschaften verwenden, um ein Image zu erstellen, das ein Standard-Startprogramm enthält und die manuelle Angabe der Parameter für das Startprogramm beim Starten von Docker Run unterstützt. Zum Beispiel. Verwenden Sie ENTRYPOINT, um den Start des nginx-Programms anzugeben, und geben Sie die Standardausführungsparameter an, um Hilfeinformationen anzuzeigen. Das Dockerfile ist wie folgt aufgebaut:
Wenn Sie docker run --name test -it test_nginx verwenden, ohne Parameter zu übergeben, wird der Befehl nach der cmd-Anweisung beim Starten des Containers als Standardparameter verwendet und die Hilfeinformationen von nginx werden ausgedruckt. Zu diesem Zeitpunkt ist der Inhalt nach cmd kein vollständiger Befehl, sondern ein Parameter. Wenn sein Inhalt ein vollständiger Befehl ist, wird der Inhalt im ENTRYPOINT überschrieben. Wenn Sie zum Starten docker run --name test -it test_nginx -g "daemon off" verwenden, überschreiben die angegebenen Ausführungsparameter den Inhalt, der der CMD-Anweisung entspricht. Zu diesem Zeitpunkt wird nginx als Vordergrundprozess ausgeführt und als Webserver verwendet. Sie können „Hallo Welt“ über den Browser sehen. Zusatzwissen: Tipps zum Schreiben von docker-entrypoint.sh-Eintragsdateien Im offiziellen Docker-Register (store.docker.com) stellen beliebte Anwendungen von Drittanbietern auf ihren Seiten Links zu Dockerfiles bereit. Viele Dockerfiles haben ENTRYPOINT-Befehle, die wie folgt geschrieben sind ["docker-entrypoint.sh"] Dieser Artikel stellt die spezielle Verwendung und Designlogik von docker-entrypoint.sh vor. MySQL
Jedes Skript, das Sie schreiben, sollte mit set -e beginnen. Dadurch wird Bash angewiesen, beendet zu werden, wenn eine Anweisung etwas anderes als true ergibt. Dadurch wird verhindert, dass sich Fehler zu einem schwerwiegenden Fehler auswachsen, der früher hätte behandelt werden sollen. Für eine bessere Lesbarkeit verwenden Sie set -o errexit, das dasselbe bewirkt wie set -e.
Der Entwurfszweck ist der gleiche wie oben, d. h. Sie möchten sofort nach dem Ausführungsfehler beenden und nicht weiter ausführen. Der Umfang von -o pipefail ist die Pipeline, d. h. im Linux-Skript sollte es sofort beendet werden, wenn die Ausführung des vorherigen Befehls fehlschlägt.
Wenn Sie in Linux Platzhalter wie * ? verwenden und keine Übereinstimmung mit der Datei gefunden wird, wird nicht die Meldung „Datei oder Verzeichnis nicht vorhanden“ ausgegeben, sondern die Parameter nach dem Befehl werden entfernt und der Befehl ausgeführt.
Dies ist eine Urteilsbegründung. Im offiziellen Dokument wurde die vorherige Zeile auskommentiert: if command starts with an option, prepend mysqld Die Beurteilungsanweisung lautet $ {1:0:1}, was bedeutet, dass $ 1 (der erste Parameter beim Aufrufen des Skripts), der Offset 0 (kein Offset) beurteilt und ein Zeichen (die Länge der Zeichenfolge) übernommen wird. Wenn das erste Zeichen des Parameters nach dem Skript ein Bindestrich ist, werden alle nachfolgenden Zeichenfolgen als mysqld-Startparameter betrachtet. Die obige Operation ähnelt dem String-Slicing von Python
Nachdem festgestellt wurde, dass der erste Parameter mit - beginnt, wird der Befehl set -- mysqld "$@" ausgeführt. Dabei wird die set -- Syntax verwendet. set -- speichert alle durch Leerzeichen getrennten Zeichenfolgen in den Variablen $1, $2 und $3 der Reihe nach, wobei das neue $@ der gesamte Inhalt nach set -- ist. Beispiel: bash docker-entrypoint.sh -f xxx.conf In diesem Fall ist der Wert von $@ in set --mysqld "$@" -f xxx.conf Nach der Ausführung des Befehls set --mysqld "$@": $1=mysqld $2=-f $3=xxx.conf $@=mysqld -f xxx.conf Sie können sehen, dass sich der Wert von $@ ändert, wenn das Skript docker-entrypoint.sh mit dem hinzugefügten Parameter -x ausgeführt wird. Auf der Grundlage des ursprünglichen $@-Werts wird der Befehl mysqld vorab hinzugefügt.
In fast jeder letzten Zeile des Skripts docker-entrypoint.sh wird der Befehl exec "$@" ausgeführt. Die Bedeutung dieses Befehls besteht darin, dass Sie die Aufrufszenarien vorweggenommen haben, die für Ihr Image zu erwarten sind. Wenn die Person, die das Image tatsächlich verwendet, einen ausführbaren Befehl ausführt, den Sie nicht erwartet haben, wird zur letzten Zeile des Skripts gewechselt, um den neuen ausführbaren Befehl des Benutzers auszuführen. Lagebeurteilung Die letzte Zeile des Skripts ist oben direkt erwähnt. Im vorherigen Skript müssen Sie die Situationen, in denen Ihr eigenes Skript aufgerufen werden kann, vollständig berücksichtigen. Nehmen wir als Beispiel die offizielle MySQL-Dockerdatei. Sie bestimmt die folgenden Situationen: Beginnt mit -, wird es als Parameter betrachtet Der Name beginnt mit mysqld und die Benutzer-ID ist 0 (Root-Benutzer). Der Fall, in dem mysqld am Anfang steht Nachdem Sie alle Aufrufformen Ihrer Anwendung festgelegt haben, sollten Sie am Ende den Befehl exec "$@" hinzufügen
Arrays in der Shell, die direkte Ausführung von ${mysql[@]} führt dieses Array als ausführbares Programm aus ➜ /tmp mysql=(mysql --protocol=socket -uroot -hlocalhost --socket="${SOCKET}" ) ➜ /tmp echo ${mysql[1]} MySQL ➜ /tmp echo ${mysql[2]} --protocol=Socket ➜ /tmp echo ${mysql[3]} -uroot ➜ /tmp echo ${mysql[4]} -hlocalhost ➜ /tmp echo ${mysql[@]} mysql --protocol=socket -uroot -hlocalhost --socket= exec gosu mysql „$BASH_SOURCE“ „$@“ Der Befehl gosu ist hier ein leichter „Ersatz“ für den Befehl sudo in Linux gosu ist ein in der Sprache Golang entwickeltes Tool, das den Befehl sudo in der Shell ersetzt. Die Befehle su und sudo weisen einige Mängel auf, die hauptsächlich zu unsicherem TTY und Problemen mit der Signalweiterleitung führen. Wenn Sie nur ein Programm mit einem bestimmten Benutzer ausführen möchten, ist die Verwendung von su oder sudo zu aufwändig, daher wurde gosu entwickelt. gosu übernimmt direkt das Prinzip von libcontainer, um Anwendungen in Containern zu starten, und verwendet /etc/passwd, um Anwendungen zu verarbeiten. gosu findet zuerst den angegebenen Benutzer oder die angegebene Benutzergruppe und wechselt dann zu diesem Benutzer oder dieser Benutzergruppe. Als nächstes verwendet es exec, um die Anwendung zu starten. Bisher hat gosu seine Arbeit abgeschlossen und wird nicht am nachfolgenden Deklarationszyklus der Anwendung teilnehmen. Diese Methode vermeidet das Problem, dass gosu TTY verarbeitet und Semaphore weiterleitet, und übergibt diese beiden Aufgaben direkt an die Anwendung, um sie abzuschließen Die obige Beschreibung des Unterschieds zwischen ENTRYPOINT und CMD in Dockerfile ist der gesamte Inhalt, den der Editor mit Ihnen teilt. Ich hoffe, es kann Ihnen als Referenz dienen. Ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen. Das könnte Sie auch interessieren:
|
<<: Universelle Lösung für den Fehler beim Starten von MySQL unter Windows
>>: Tipps zum Erstellen von Web-Tabellenrahmen
Inhaltsverzeichnis 1. Bootstrap5-Haltepunkte 1.1 ...
1 Rufen Sie die Alibaba Cloud-Konsole auf, suchen...
pthread_create-Funktion Funktionseinführung pthre...
Vorwort: Dieser Artikel basiert auf den Erfahrung...
Eines Tages stellte ich fest, dass die Ausführung...
Einfaches Beispiel für einen MySQL-Trigger Gramma...
1. Hintergrund Netplan ist ein neues Befehlszeile...
1. Erstellen Sie ein Docker-Netzwerk Docker-Netzw...
Inhaltsverzeichnis Was ist der Proxy-Modus? Einfü...
Ich konnte nie herausfinden, ob der Port belegt i...
Führen Sie cmd mit Administratorrechten aus slmgr...
Das in diesem Artikel beschriebene Layout gleiche...
In Anwendungen mit Paging-Abfragen sind Abfragen,...
Klicken Sie hier, um zum Abschnitt „HTML-Tutorial“...
Diese Arbeit nutzt das Wissen der Front-End-Entwi...