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

Tipps zur Verwendung des Befehls „Docker Inspect“

Beschreibung und Einführung Docker Inspect ist ei...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 5.7.23

Dieser Artikel zeichnet den detaillierten Install...

Analyse des rel-Attributs in HTML

.y { background: url(//img.jbzj.com/images/o_y.pn...

Erläuterung unveränderlicher Werte in React

Inhaltsverzeichnis Was sind unveränderliche Werte...

Einführung und Installation von vue-cli

Inhaltsverzeichnis 1. Einleitung 2. Einführung in...

Beispielcode zur Implementierung eines einfachen ListViews-Effekts in HTML

HTML zum Erreichen eines einfachen ListViews-Effe...

Lernen Sie einfach verschiedene SQL-Joins

Mit der SQL JOIN-Klausel können Zeilen aus zwei o...

Vue + Element dynamische Mehrfachheader und dynamische Slots

Inhaltsverzeichnis 1. Nachfrage 2. Wirkung 3. All...

So beheben Sie die durch MySQL DDL verursachte Synchronisierungsverzögerung

Inhaltsverzeichnis Vorwort Lösung Tool-Einführung...

Verwendung des Linux-Stat-Befehls

1. Befehlseinführung Der Befehl stat wird verwend...