Detaillierte Erklärung der Docker-Einstiegspunktdatei

Detaillierte Erklärung der Docker-Einstiegspunktdatei

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 if command starts with an option, prepend mysqld 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

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: 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.

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:

  • 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

${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

Artikel empfehlen

So verwenden Sie die JSX-Syntax richtig in Vue

Inhaltsverzeichnis Vorwort Virtueller DOM Was ist...

So verwenden Sie vue3+TypeScript+vue-router

Inhaltsverzeichnis Einfach zu bedienen Erstellen ...

Detaillierte Erläuterung der DOM-Stileinstellungen in vier Reaktionskomponenten

1. Inline-Stile Um Inline-Stile zum virtuellen DO...

Ein kurzer Vortrag über die Variablenförderung in JavaScript

Inhaltsverzeichnis Vorwort 1. Welche Variablen we...

Detaillierte Erklärung zum Festlegen des Kontextpfads in der Webanwendung

URL: http://hostname.com/contextPath/servletPath/...

Einführung in den Aufbau eines DNS-Servers unter centos7

Inhaltsverzeichnis 1. Projektumgebung: 2: DNS-Ser...

Analyse des Prinzips der Verwendung von PDO zur Verhinderung von SQL-Injection

Vorwort Dieser Artikel verwendet die Vorverarbeit...

Mehrere Methoden zum Bereitstellen mehrerer Front-End-Projekte mit nginx

Ich habe 3 Methoden zusammengefasst, um mehrere F...

Anwendungshandbuch für chinesische WEB-Schriftarten

Die Verwendung von Schriftarten im Web ist sowohl ...

JavaScript zum Erzielen digitaler Uhreffekte

In diesem Artikelbeispiel wird der spezifische Co...