So steuern Sie die Startreihenfolge von Docker Compose-Diensten

So steuern Sie die Startreihenfolge von Docker Compose-Diensten

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:
  • Detaillierte Erläuterung der Docker Compose-Dienstorchestrierung

<<:  Vue implementiert Card-Flip-Karussellanzeige

>>:  Detaillierte Installations- und Konfigurationsschritte für die MySQL 5.7-Zip-Version (Zip-Version)

Artikel empfehlen

CSS-Implementierungscode für die Textausrichtung

Beim Erstellen von Formularen kommt es häufig vor...

Detaillierte Erklärung zum Upgrade von Softwarepaketversionen unter Linux

Im Linux-Umfeld möchten Sie prüfen, ob eine besti...

Eine kurze Einführung in die MySQL-Speicher-Engine

1. MySql-Architektur Bevor wir die Speicher-Engin...

Wie lang ist eine Funktion in js?

Inhaltsverzeichnis Vorwort Warum Wie viel kostet ...

Detaillierte Erläuterung der MySQL SQL-Anweisungsanalyse und Abfrageoptimierung

So erhalten Sie SQL-Anweisungen mit Leistungsprob...

Was tun, wenn Sie Ihr Linux/Mac MySQL-Passwort vergessen?

Was tun, wenn Sie Ihr Linux/Mac MySQL-Passwort ve...

Detaillierte Erklärung zum CSS-Randkollaps

Vorherige Das ist eine klassische alte Frage. Da ...

JavaScript zum Erzielen eines einfachen Drag-Effekts

In diesem Artikel wird der spezifische JavaScript...

Konfigurieren Sie ein Implementierungsbeispiel für den Mysql-Master-Slave-Dienst

Konfigurieren Sie ein Implementierungsbeispiel fü...