Schließen Sie beim Schreiben einer Docker-Datei eine Einstiegspunktkonfiguration ein, die verwendet wird, um vor dem Start des Containers eine Initialisierungskonfiguration oder eine benutzerdefinierte Konfiguration vorzunehmen. Normalerweise handelt es sich dabei um ein Skript, und die entsprechenden vordefinierten Elemente werden dann im Skript konfiguriert. In diesem Dokument werden die Fähigkeiten zum Schreiben von Einstiegspunktdateien ausführlich erläutert. Im Folgenden wird die Entrypoint-Datei docker-entrypoint.sh im offiziellen MySQL-Image als Beispiel verwendet. Die Dateiadresse lautet: docker-entrypoint.sh setze -e 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. setze -o Pipefail 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. shopt -s nullglob 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. wenn [ "${1:0:1}" = '-' ]; dann... Dies ist Die Beurteilungsanweisung lautet 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 setze --mysqld "$@" Nachdem festgestellt wurde, dass der erste Parameter mit - beginnt, wird der Befehl set -- mysqld "$@" ausgeführt. Dabei wird die set -- Syntax verwendet. Der set -- speichert alle durch Leerzeichen getrennten Zeichenfolgen in den Variablen $1, $2 und $3 der Reihe nach, wobei das neue $@ der gesamte Inhalt nach dem set -- ist. Beispiel: In diesem Fall ist der Wert von $@ in Nach der Ausführung des Befehls set --mysqld "$@":
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. Ausführung "$@" 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:
${mysql[@]} Arrays in der Shell, die direkte Ausführung von ${mysql[@]} führt dieses Array als ausführbares Programm aus mysql=(mysql --protocol=socket -uroot -hlocalhost --socket="${SOCKET}" ) echo ${mysql[1]} -- Ausgabe: mysql echo ${mysql[2]} --Ausgabe: --protocol=socket echo ${mysql[3]} --Ausgabe: -uroot echo ${mysql[4]} --Ausgabe: -hlocalhost echo ${mysql[@]} --output: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 Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird. |
<<: Bringen Sie Ihnen Schritt für Schritt bei, den MySQL-Remotezugriff zu konfigurieren
>>: Vergleich mehrerer Beispiele zur Einfügungseffizienz in MySQL
Inhaltsverzeichnis Vorwort Virtueller DOM Was ist...
Der Autor arbeitet seit über einem Jahr an einem ...
Was ist Docker-Compose Das Compose-Projekt entsta...
Inhaltsverzeichnis Einfach zu bedienen Erstellen ...
1. Inline-Stile Um Inline-Stile zum virtuellen DO...
Inhaltsverzeichnis Vorwort 1. Welche Variablen we...
URL: http://hostname.com/contextPath/servletPath/...
Inhaltsverzeichnis 1. Projektumgebung: 2: DNS-Ser...
Umgebungseinführung Betriebssystem: Centos 7.4 Za...
Vorwort Dieser Artikel verwendet die Vorverarbeit...
Ich habe 3 Methoden zusammengefasst, um mehrere F...
Als ich kürzlich ein kleines Programm entwickelte...
Die Verwendung von Schriftarten im Web ist sowohl ...
Umsetzungseffekt: 1. count(1) und count(*) Wenn d...
In diesem Artikelbeispiel wird der spezifische Co...