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

Detaillierte Erläuterung der Docker Swarm-Dienstorchestrierungsbefehle

1. Einleitung Docker verfügt über ein Orchestrier...

Analyse eines MySQL-Deadlock-Szenariobeispiels

Vorwort Kürzlich stieß ich auf ein Deadlock-Probl...

Der Browser der Betaversion IE9 unterstützt HTML5/CSS3

Manche Leute sagen, dass IE9 die zweite Revolutio...

Miniprogramm zur Implementierung des Paging-Effekts

In diesem Artikelbeispiel wird der spezifische Co...

VMware ESXI-Servervirtualisierungscluster

Inhaltsverzeichnis Zusammenfassung Umgebung und W...

Galeriefunktion durch natives Js implementiert

Inhaltsverzeichnis Der erste Der Zweite Native Js...

Nginx-Lastausgleichsalgorithmus und Failover-Analyse

Überblick Der Lastenausgleich von Nginx bietet Up...

Installations-Tutorial zur neuesten MySQL-Version 8.0.17 mit Dekomprimierung

Ich persönlich denke, dass die dekomprimierte Ver...

Detaillierte Erklärung der einfachen HTML- und CSS-Verwendung

Ich werde drei Tage benötigen, um den statischen ...

Einführung und Verwendung der Angular-Pipeline PIPE

Vorwort PIPE, übersetzt als Pipeline. Angular Pip...

Über das Problem der Offline-Installation des Docker-Pakets unter CentOS 8.4

Die verwendete virtuelle Maschine ist CentOS 8.4,...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 8.0.25

Das neueste Download- und Installationstutorial f...