Eine kurze Erläuterung zur Lösung des Depends_on-Reihenfolgeproblems in Docker-Compose

Eine kurze Erläuterung zur Lösung des Depends_on-Reihenfolgeproblems in Docker-Compose

Die Verwendung von depends_on zum Sortieren von Containern löst das Abhängigkeitsproblem zwischen Containern nicht perfekt. Der Grund dafür ist, dass depends_on nur sicherstellen kann, dass der Container in den Status „Ausführen“ wechselt, nicht in den Status „Abgeschlossen“ (ich weiß nicht, wie ich das beschreiben soll).

Im Internet wurden Lösungen aufgelistet, die Wait-for-it oder Wait-for verwenden, um beim Start auf die Container zuzugreifen, die zuerst gestartet werden müssen, und diese zu starten, wenn der Zugriff erfolgreich ist. Sie sind jedoch nicht detailliert genug und viele von ihnen haben sogar denselben Inhalt (hier möchte ich mich über die chaotische Umgebung beschweren).

Vielleicht bin ich dumm, ich habe einen Tag gebraucht, um es zu lösen, deshalb zeichne ich es hier auf.

Ich habe wait-for verwendet, wait-for-it.sh hat beim Testen einen Fehler ausgegeben und war daher nutzlos.

Text:

Die Anforderung besteht darin, eine gepackte AR-Datei in Nacos zu registrieren, aber Nacos startet langsam, sodass sequentielle Einstellungen erforderlich sind.

]

Löschen Sie die erforderlichen JAR-Dateien auf der virtuellen Maschine oder dem Server. Als nächstes schreiben Sie dockerfile und docker-compose

Bildbeschreibung hier einfügen

VON openjdk:8-jre // Basierend auf openjdk 
COPY wait-for . //Kopiere wait-for in die virtuelle Maschine RUN apt-get update //Aktualisiere Quelle,
RUN apt-get install netcat -y // Installiere netcat, wait-for erfordert die Verwendung von WORKDIR /app // Setze den Zielpunkt ADD course.jar course.jar // Füge die JAR-Datei zur virtuellen Maschine hinzu EXPOSE 8002 // Der Port, der freigegeben werden soll

Meine Konfiguration basiert auf dem Bild und der Codeblock dient zum besseren Verständnis. Ich denke, da sollte es keinen Unterschied geben.

Docker-Compose

Bildbeschreibung hier einfügen

Version: '3.0'
Leistungen:
  nacos:
    Bild: nacos/nacos-server:1.1.4
    Containername: nacos
    Häfen:
      - „8848:8848“
    Umfeld:
      MODUS: Standalone # Nacos-Einzelknoten läuft Kurs:
    Erstellen: /root/
    Containername: Kurs
    Häfen:
      - "18002:18002"
    hängt ab von:
      -nacos
    Befehl: ["sh", "warten auf", "nacos:8848", "--", "java", "-jar", "course.jar"]

Ich werde hier nicht zu sehr ins Detail gehen, es unterscheidet sich nicht sehr vom Üblichen.

In dem Beitrag, den ich zuvor gefunden habe, wurde die Dockerfile-Datei nicht gepostet. Das Wichtigste hier ist, wait-for auf die virtuelle Maschine zu kopieren, da sich die vom in docker-compose konfigurierten Befehl verwendete Datei im Container befindet. Wenn Sie sie nicht kopieren, werden Sie die Datei nicht finden. Anschließend werden apt-get update und apt-get install netcat -y wait-for Laufzeitumgebung installiert.

In meinem wait-for Code ist Zeile 26 die Timeout-Periode. Anfangs war sie 15, aber die Zeit war zu kurz und das Container-Timeout wurde auf 60 eingestellt. Dies ist der einzige Unterschied zum Original. Sie können es später testen und ausführen.

#!/bin/sh

# Die MIT-Lizenz (MIT)
#
# Copyright (c) 2017 Eficode Oy
#
# Die Genehmigung wird hiermit kostenlos an jede Person erteilt, die eine Kopie erhält
# dieser Software und der dazugehörigen Dokumentationsdateien (die „Software“), um
# an der Software ohne Einschränkung, insbesondere die Rechte
# zu verwenden, zu kopieren, zu ändern, zusammenzufügen, zu veröffentlichen, zu verteilen, unterzulizenzieren und/oder zu verkaufen
# Kopien der Software, und um Personen, denen die Software zur Verfügung gestellt wird,
# hierfür vorgesehen, vorbehaltlich der folgenden Bedingungen:
#
# Der obige Copyright-Vermerk und dieser Genehmigungsvermerk müssen in allen
# Kopien oder wesentliche Teile der Software.
#
# DIE SOFTWARE WIRD „WIE BESEHEN“ BEREITGESTELLT, OHNE JEGLICHE AUSDRÜCKLICHE ODER
# STILLSCHWEIGEND, EINSCHLIESSLICH ABER NICHT BESCHRÄNKT AUF DIE GARANTIEN DER MARKTGÄNGIGKEIT,
# EIGNUNG FÜR EINEN BESTIMMTEN ZWECK UND NICHTVERLETZUNG. IN KEINEM FALL
# AUTOREN ODER COPYRIGHTINHABER HAFTBAR FÜR JEGLICHE ANSPRÜCHE, SCHÄDEN ODER ANDERE
# HAFTUNG, OB AUS VERTRAG, UNERLAUBTER HANDLUNG ODER ANDERWEITIG, AUS
# AUS ODER IM ZUSAMMENHANG MIT DER SOFTWARE ODER DER VERWENDUNG ODER ANDEREN
# SOFTWARE.

setzen -- "$@" -- "$TIMEOUT" "$QUIET" "$PROTOCOL" "$HOST" "$PORT" "$result"
TIMEOUT=60
RUHIG=0
# Das Protokoll, mit dem die Anfrage gestellt werden soll, entweder „tcp“ oder „http“
PROTOKOLL="tcp"

echoerr() {
  wenn [ "$QUIET" -ne 1 ]; dann printf "%s\n" "$*" 1>&2; fi
}

Verwendung() {
  Beendigungscode="$1"
  Katze << VERWENDUNG >&2
Verwendung:
  $0 Host:Port|URL [-t Zeitüberschreitung] [-- Befehlsargumente]
  -q | --quiet Keine Statusmeldungen ausgeben
  -t TIMEOUT | --timeout=timeout Timeout in Sekunden, Null für kein Timeout
  -- COMMAND ARGS Befehl mit Argumenten ausführen, nachdem der Test abgeschlossen ist
VERWENDUNG
  beenden "$exitcode"
}

warte_auf() {
  Fall "$PROTOCOL" in
    TCP
      wenn ! Befehl -v nc >/dev/null; dann
        echoerr 'nc-Befehl fehlt!'
        Ausfahrt 1
      fi
      ;;
    wget)
      wenn ! Befehl -v wget >/dev/null; dann
        echoerr 'wget-Befehl fehlt!'
        Ausfahrt 1
      fi
      ;;
  esac

  während :; tun
    Fall "$PROTOCOL" in
      TCP 
        nc -w 1 -z "$HOST" "$PORT" > /dev/null 2>&1
        ;;
      http)
        wget --timeout=1 -q "$HOST" -O /dev/null > /dev/null 2>&1 
        ;;
      *)
        echoerr "Unbekanntes Protokoll '$PROTOCOL'"
        Ausfahrt 1
        ;;
    esac

    Ergebnis=$?
        
    wenn [ $result -eq 0 ] ; dann
      wenn [ $# -gt 7 ] ; dann
        für Ergebnis in $(seq $(($# - 7))); tun
          Ergebnis=$1
          Schicht
          setze -- "$@" "$ergebnis"
        Erledigt

        TIMEOUT=$2 QUIET=$3 PROTOKOLL=$4 HOST=$5 PORT=$6 Ergebnis=$7
        Schicht 7
        Ausführung "$@"
      fi
      Ausfahrt 0
    fi

    wenn [ "$TIMEOUT" -le 0 ]; dann
      brechen
    fi
    TIMEOUT=$((TIMEOUT - 1))

    Schlaf 1
  Erledigt
  echo "Zeitüberschreitung beim Vorgang" >&2
  Ausfahrt 1
}

während :; machen
  Fall "$1" in
    http://*|https://*)
    HOST="$1"
    PROTOKOLL="http"
    Schicht 1
    ;;
    *:* )
    HOST=$(printf "%s\n" "$1"| cut -d : -f 1)
    PORT=$(printf "%s\n" "$1"| cut -d : -f 2)
    Schicht 1
    ;;
    -q | --quiet)
    RUHIG=1
    Schicht 1
    ;;
    -Q-*)
    RUHIG=0
    echoerr "Unbekannte Option: $1"
    Verwendung 1
    ;;
    -Q*)
    RUHIG=1
    Ergebnis=$1
    Schicht 1
    setzen -- -"${result#-q}" "$@"
    ;;
    -t | --timeout)
    TIMEOUT="$2"
    Schicht 2
    ;;
    -T*)
    TIMEOUT="${1#-t}"
    Schicht 1
    ;;
    --timeout=*)
    ZEITÜBERSCHREITUNG="${1#*=}"
    Schicht 1
    ;;
    --)
    Schicht
    brechen
    ;;
    --helfen)
    Nutzung 0
    ;;
    -*)
    RUHIG=0
    echoerr "Unbekannte Option: $1"
    Verwendung 1
    ;;
    *)
    RUHIG=0
    echoerr "Unbekanntes Argument: $1"
    Verwendung 1
    ;;
  esac
Erledigt

wenn ! [ "$TIMEOUT" -ge 0 ] 2>/dev/null; dann
  echoerr "Fehler: ungültiges Timeout '$TIMEOUT'"
  Verwendung 3
fi

Fall "$PROTOCOL" in
  TCP
    wenn [ "$HOST" = "" ] || [ "$PORT" = "" ]; dann
      echoerr "Fehler: Sie müssen zum Testen einen Host und einen Port angeben."
      Verwendung 2
    fi
  ;;
  http)
    wenn [ "$HOST" = "" ]; dann
      echoerr "Fehler: Sie müssen zum Testen einen Host angeben."
      Verwendung 2
    fi
  ;;
esac

warte_auf "$@"

Dies ist das Ende dieses Artikels über die Lösung des Depends_on-Reihenfolgeproblems in Docker-Compose. Weitere relevante Inhalte zur Depends_on-Reihenfolge von Docker-Compose finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Praktische Hinweise zur Installation von Jenkins mit Docker-Compose
  • Detaillierter Prozess für den Einstieg mit Docker Compose HelloWorld
  • Installations- und Verwendungsschritte für Docker Compose
  • Detaillierte Erklärung des Sidecar-Modus in Docker Compose

<<:  CSS 3.0 Text Hover Jump Spezialeffekte-Code

>>:  Praktische Funktionsweise der Verwendung beliebiger Schriftarten auf einer Webseite mit Demonstration

Artikel empfehlen

Detaillierte Verwendung von React.Children

Inhaltsverzeichnis 1. Reagieren.Children.map 2. R...

Detaillierte Erklärung des HTML-Bereichs-Tags

Der <area>-Tag definiert einen Bereich in e...

Das Vue-Projekt implementiert eine Fortschrittsbalkenfunktion für den Dateidownload

Im täglichen Geschäftsleben gibt es zwei gängige ...

Detailliertes Tutorial zur Installation von Docker auf CentOS 8.4

Inhaltsverzeichnis Vorwort: Systemanforderungen: ...

Tutorial zum Konfigurieren und Verwenden des i3-Fenstermanagers unter Linux

In diesem Artikel zeige ich Ihnen, wie Sie i3 auf...

Kopieren und Einfügen ist der Feind der Verpackung

Bevor wir über OO, Entwurfsmuster und die vielen o...

Das kürzeste JS, um festzustellen, ob es sich um IE6 handelt (IE-Schreibmethode)

Häufig verwendeter JavaScript-Code zum Erkennen d...

Detaillierte Erläuterung der MySQL-Datenbankisolationsebene und des MVCC

Inhaltsverzeichnis 1. Isolationsstufe LESEN SIE U...

Dieser Artikel zeigt Ihnen detailliert, wie Sie SQL CASE WHEN verwenden

Inhaltsverzeichnis Einfache CASEWHEN-Funktion: Di...