Zusammenfassung Docker-Compose kann problemlos mehrere Docker-Containerdienste kombinieren. Wenn jedoch Abhängigkeiten zwischen Containerdiensten bestehen, kann Docker-Compose die Startreihenfolge der Dienste nicht garantieren. Die depends_on-Konfiguration in Docker-Compose ist die Startreihenfolge der Container, nicht die Startreihenfolge der Dienste in den Containern. Reproduktion des Problems Lassen Sie uns zunächst ein Beispiel erstellen, um die durch Docker-Compose verursachten Probleme zu demonstrieren. Die Datei docker-compose.yml sieht wie folgt aus: Version: '2' Leistungen: Webseite: Bild: Ubuntu:14.04 hängt ab von: - Netz Befehl: nc -z Datenbank 3306 Datenbank: Bild: Ubuntu:14.04 Befehl: > /bin/bash -c ' Schlaf 5; echo "übernachten"; nc -lk 0.0.0.0 3306; ' Nach dem Start stellt man fest, dass zuerst die Datenbank und dann das Web gestartet wird, der Dienst in der Datenbank jedoch nach etwa 5 Sekunden beendet ist, sodass der Start des Webs fehlschlägt. $ Docker-Compose nach oben tmp_database_1 wird erstellt ... fertig tmp_database_1 wird erstellt ... tmp_web_1 wird erstellt ... fertig Anhängen an tmp_database_1, tmp_web_1 tmp_web_1 wurde mit Code 1 beendet. database_1 | Übernachten Problemlösungsmethode 1.0 Ändern Sie das Web-Startskript und warten Sie, bis der Datenbankport verbunden ist, bevor Sie den Dienst starten Version: '2' Leistungen: Webseite: Bild: Ubuntu:14.04 hängt ab von: - Datenbank Befehl: > /bin/bash -c ' während !nc -z Datenbank 3306; Tun echo "auf Datenbank warten"; Schlaf 1; Erledigt; echo "Datenbank ist bereit!"; echo "Webdienst hier starten"; ' Datenbank: Bild: Ubuntu:14.04 Befehl: > /bin/bash -c ' Schlaf 5; echo "übernachten"; nc -lk 0.0.0.0 3306; ' Neustart, $ Docker-Compose nach oben tmp_database_1 wird erstellt ... fertig tmp_database_1 wird erstellt ... tmp_web_1 wird erstellt ... fertig Anhängen an tmp_database_1, tmp_web_1 web_1 | warte auf Datenbank web_1 | warte auf Datenbank web_1 | warte auf Datenbank web_1 | warte auf Datenbank web_1 | warte auf Datenbank database_1 | Übernachten web_1 | Datenbank ist bereit! web_1 | Webdienst hier starten tmp_web_1 wurde mit Code 0 beendet. Das Web wird gestartet, nachdem die Datenbank gestartet und der Port verbunden wurde. Problemlösung 2.0 Obwohl die obige Lösung das Problem lösen kann, ist das direkte Einfügen von Skripten in YAML schwierig zu verwalten und fehleranfällig. Wenn mehrere Abhängigkeiten oder mehrere Abhängigkeitsebenen vorhanden sind, steigt die Komplexität stark an. Daher müssen wir ein entrypoint.sh-Skript kapseln, das den Startbefehl sowie den zu wartenden Dienst und Port akzeptieren kann. Der Skriptinhalt lautet wie folgt: #!/bin/bash #set -x #******************************************************************************** # @file: Einstiegspunkt.sh # @Autor: wangyubin # @Datum : 2018-08-1 10:18:43 # # @brief: Einstiegspunkt zum Verwalten der Service-Startreihenfolge # Verlauf: init #******************************************************************************** : ${SLEEP_SECOND:=2} warte_auf() { Echo: Wartet auf $1, um auf $2 zu lauschen … während ! nc -z $1 $2; echo warten...; schlafen $SLEEP_SECOND; fertig } deklarieren HÄNGT AB CMD deklarieren während getopts "d:c:" arg Tun Fall $arg in D) DEPENDS=$OPTARG ;; C) CMD=$OPTARG ;; ?) echo "unbekanntes Argument" Ausfahrt 1 ;; esac Erledigt für var in ${DEPENDS//,/ } Tun Gastgeber=${var%:*} Port = $ {var#*:} warte_auf $host $port Erledigt $CMD auswerten Dieses Skript hat zwei Parameter: -d ist der Dienst und Port, auf die gewartet werden soll, -c ist der Startbefehl, nachdem der Dienst und der Port gestartet wurden. Ändern Sie docker-compose.yml und verwenden Sie das Skript entrypoint.sh, um die Startreihenfolge zu steuern. Version: '2' Leistungen: Webseite: Bild: Ubuntu:14.04 hängt ab von: - Datenbank Bände: - „./entrypoint.sh:/entrypoint.sh“ Einstiegspunkt: /entrypoint.sh -d Datenbank:3306 -c ‚echo „Webdienst hier starten“‘; Datenbank: Bild: Ubuntu:14.04 Befehl: > /bin/bash -c ' Schlaf 5; echo "übernachten"; nc -lk 0.0.0.0 3306; ' Bei der tatsächlichen Verwendung können Sie entrypoint.sh auch in das veröffentlichte Image packen, ohne das Skript entrypoint.sh über die Volumekonfiguration laden zu müssen. Die Testergebnisse lauten wie folgt: $ Docker-Compose nach oben tmp_database_1 wird gestartet ... fertig tmp_web_1 wird gestartet ... fertig Anhängen an tmp_database_1, tmp_web_1 web_1 | Warte darauf, dass die Datenbank auf 3306 lauscht … web_1 | warten... web_1 | warten... web_1 | warten... database_1 | Übernachten web_1 | Webdienst hier starten tmp_web_1 wurde mit Code 0 beendet. Auffüllen Hängt von mehreren Diensten und Ports ab Mit dem obigen Skript entrypoint.sh können Sie auch mehrere Dienste und Ports verwenden, indem Sie die mehreren Dienste und Ports nach dem Parameter -d durch ein Komma (,) trennen. Version: '2' Leistungen: Webseite: Bild: Ubuntu:14.04 hängt ab von: -mysql - PostgreSQL Bände: - „./entrypoint.sh:/entrypoint.sh“ Einstiegspunkt: /entrypoint.sh -d mysql:3306,postgresql:5432 -c 'echo "Webdienst hier starten"'; MySQL: Bild: Ubuntu:14.04 Befehl: > /bin/bash -c ' Schlaf 4; echo "übernachten"; nc -lk 0.0.0.0 3306; ' postgresql: Bild: Ubuntu:14.04 Befehl: > /bin/bash -c ' Schlaf 8; echo "übernachten"; nc -lk 0.0.0.0 5432; ' Sie können den Ausführungseffekt selbst ausprobieren. Konfiguration des Try-Intervalls Die Wartezeit für jeden Verbindungsversuch kann über die Umgebungsvariable SLEEP_SECOND konfiguriert werden. Der Standardwert beträgt 2 Sekunden. Wenn die folgende Konfiguration die Wartezeit auf 4 Sekunden einstellt, wird alle 4 Sekunden versucht, eine Verbindung zum MySQL-Dienst herzustellen. Version: '2' Leistungen: Webseite: Bild: Ubuntu:14.04 Umfeld: SLEEP_SECOND: 4 hängt ab von: -mysql Bände: - „./entrypoint.sh:/entrypoint.sh“ Einstiegspunkt: /entrypoint.sh -d mysql:3306 ‚echo „Webdienst hier starten“‘; MySQL: Bild: Ubuntu:14.04 Befehl: > /bin/bash -c ' Schlaf 4; echo "übernachten"; nc -lk 0.0.0.0 3306; ' 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. Das könnte Sie auch interessieren:
|
<<: Vue implementiert Card-Flip-Karussellanzeige
Inhaltsverzeichnis 1. Gemeinsam genutztes CommonM...
Beschreibung und Einführung Docker Inspect ist ei...
Eine Umgebung Alibaba Cloud Server: CentOS 7.4 64...
Dieser Artikel zeichnet den detaillierten Install...
.y { background: url(//img.jbzj.com/images/o_y.pn...
Inhaltsverzeichnis Was sind unveränderliche Werte...
Inhaltsverzeichnis 1. Einleitung 2. Einführung in...
Das Büro benötigt ein Ubuntu-System als Linux-Ent...
HTML zum Erreichen eines einfachen ListViews-Effe...
Mit der SQL JOIN-Klausel können Zeilen aus zwei o...
1. Verwenden Sie die Floating-Methode Effektbild:...
Inhaltsverzeichnis 1. Nachfrage 2. Wirkung 3. All...
Inhaltsverzeichnis Vorwort Lösung Tool-Einführung...
1. Befehlseinführung Der Befehl stat wird verwend...
Inhaltsverzeichnis 1. Workflow ausführen 2. Grund...