Docker-compose におけるdepends_on 順序問題を解決する方法についての簡単な説明

Docker-compose におけるdepends_on 順序問題を解決する方法についての簡単な説明

コンテナをソートするためにdepends_onを使用しても、コンテナ間の依存関係の問題は完全には解決されません。その理由は、depends_onではコンテナが完了状態ではなく実行状態になることしか保証できないためです(どのように説明すればよいかわかりません)。

起動時に最初に起動する必要があるコンテナに wait-for-it または wait-for を使用してアクセスし、アクセスが成功したら起動するという解決策がネット上に挙げられていますが、詳細が不十分で、内容が似たものも多数あります (ここでは環境が乱雑であることに不満を述べたいと思います)。

私がバカなのかもしれない、解決するのに1日かかったので、ここに記録しておきます。

wait-for使用しましたが、テストするwait-for-it.shでエラーが発生したため、役に立ちませんでした。

文章:

パッケージ化された ar ファイルを nacos に登録することが要件ですが、nacos の起動が遅いため、逐次設定が必要となります。

]

仮想マシンまたはサーバー上の必要な jar ファイルを削除します。次にdockerfiledocker-compose記述します

ここに画像の説明を挿入

FROM openjdk:8-jre // openjdk ベース 
COPY wait-for . //wait-forを仮想マシンにコピー RUN apt-get update //ソースを更新、
RUN apt-get install netcat -y // netcat をインストールします。wait-for では WORKDIR /app を使用する必要があります // ランディング ポイントを設定します ADD course.jar course.jar // jar ファイルを仮想マシンに追加します EXPOSE 8002 // 公開するポート

私の設定は画像に基づいており、コード ブロックは理解を深めるためのものです。違いはないはずです。

docker-compose

ここに画像の説明を挿入

バージョン: '3.0'
サービス:
  ナコス:
    イメージ: nacos/nacos-server:1.1.4
    コンテナ名: nacos
    ポート:
      - 「8848:8848」
    環境:
      モード: スタンドアロン # nacos シングルノード実行コース:
    ビルド: /root/
    コンテナ名: コース
    ポート:
      - 「18002:18002」
    依存:
      -ナコス
    コマンド: ["sh","wait-for","nacos:8848","--","java","-jar","course.jar"]

ここではあまり詳しく説明しません。いつもとあまり変わりません。

以前見つけた投稿には dockerfile ファイルが投稿されていませんでした。ここで最も重要なのは、 docker-composeで設定したコマンドが使用するファイルはコンテナ内にあるため、 wait-forファイルを仮想マシンにコピーすることです。コピーしないと、ファイルが見つかりません。次にapt-get updateapt-get install netcat -y使用して、 wait-for実行環境をインストールします。

私のwait-forコードでは、26 行目がタイムアウト期間です。最初は 15 でしたが、時間が短すぎたため、コンテナのタイムアウトは 60 に設定されました。これがオリジナルとの唯一の違いです。後でテストして実行できます。

#!/bin/sh

# MITライセンス(MIT)
#
# 著作権 (c) 2017 Eficode Oy
#
# 本書の複製を入手したすべての人に、無償で許可を与える。
# このソフトウェアおよび関連するドキュメントファイル(以下「ソフトウェア」)の
# ソフトウェアのいかなる制限も含まない権利。
# 使用、コピー、変更、統合、公開、配布、サブライセンス、および/または販売
# ソフトウェアのコピー、およびソフトウェアを配布された人物に許可を与えること
# 以下の条件に従って、そうすることが許可されます。
#
# 上記の著作権表示とこの許可通知は、すべての
# ソフトウェアのコピーまたは大部分。
#
# ソフトウェアは「現状のまま」提供され、いかなる種類の保証も明示的または黙示的に提供されません。
# 黙示的保証(商品性保証を含むがこれに限定されない)
# 特定の目的への適合性と非侵害。いかなる場合も、
# 著者または著作権者は、いかなる請求、損害、その他の責任も負いません。
# 契約違反、不法行為、その他の理由による責任は、
# ソフトウェアまたはその使用もしくはその他の取引に関連して
# ソフトウェア。

設定 -- "$@" -- "$TIMEOUT" "$QUIET" "$PROTOCOL" "$HOST" "$PORT" "$result"
タイムアウト=60
静か=0
# リクエストを行うプロトコル。"tcp" または "http" のいずれか
プロトコル="tcp"

エコーエラー(){
  if [ "$QUIET" -ne 1 ]; then printf "%s\n" "$*" 1>&2; fi
}

使用法() {
  終了コード="$1"
  cat << 使用法 >&2
使用法:
  $0 ホスト:ポート|url [-t タイムアウト] [-- コマンド引数]
  -q | --quiet ステータスメッセージを出力しない
  -t TIMEOUT | --timeout=timeout タイムアウトは秒単位で、0 の場合はタイムアウトなし
  -- コマンド引数 テスト終了後に引数付きコマンドを実行する
使用法
  終了 "$exitcode"
}

待機() {
  ケース「$PROTOCOL」
    通信プロトコル
      if ! command -v nc >/dev/null; then
        echoerr 'nc コマンドがありません!'
        出口1
      フィ
      ;;
    wget)
      if ! command -v wget >/dev/null; then
        echoerr 'wget コマンドがありません!'
        出口1
      フィ
      ;;
  エサック

  ながら:; 行う
    ケース「$PROTOCOL」
      通信プロトコル 
        nc -w 1 -z "$HOST" "$PORT" > /dev/null 2>&1
        ;;
      (http://www.facebook.com/Selenium)
        wget --timeout=1 -q "$HOST" -O /dev/null > /dev/null 2>&1 
        ;;
      *)
        echoerr "不明なプロトコル '$PROTOCOL'"
        出口1
        ;;
    エサック

    結果=$?
        
    [ $result -eq 0 ] の場合;
      [ $# -gt 7 ] の場合;
        結果が$(seq $(($# - 7)))の場合、
          結果=$1
          シフト
          設定 -- "$@" "$result"
        終わり

        タイムアウト=$2 QUIET=$3 プロトコル=$4 ホスト=$5 ポート=$6 結果=$7
        シフト7
        実行 "$@"
      フィ
      終了 0
    フィ

    [ "$TIMEOUT" -le 0 ]の場合;
      壊す
    フィ
    タイムアウト=$((タイムアウト - 1))

    睡眠1
  終わり
  echo "操作がタイムアウトしました" >&2
  出口1
}

ながら:; 行う
  ケース「$1」
    http://*|https://*)
    ホスト="$1"
    プロトコル="http"
    シフト1
    ;;
    *:* )
    HOST=$(printf "%s\n" "$1"| cut -d : -f 1)
    ポート=$(printf "%s\n" "$1"| cut -d : -f 2)
    シフト1
    ;;
    -q | --quiet)
    静か=1
    シフト1
    ;;
    -q-*)
    静か=0
    echoerr "不明なオプション: $1"
    使用法 1
    ;;
    -q*)
    静か=1
    結果=$1
    シフト1
    設定 -- -"${result#-q}" "$@"
    ;;
    -t | --timeout)
    タイムアウト="$2"
    シフト2
    ;;
    -t*)
    タイムアウト="${1#-t}"
    シフト1
    ;;
    --timeout=*)
    タイムアウト="${1#*=}"
    シフト1
    ;;
    --)
    シフト
    壊す
    ;;
     - ヘルプ)
    使用法 0
    ;;
    -*)
    静か=0
    echoerr "不明なオプション: $1"
    使用法 1
    ;;
    *)
    静か=0
    echoerr "不明な引数: $1"
    使用法 1
    ;;
  エサック
終わり

if ! [ "$TIMEOUT" -ge 0 ] 2>/dev/null; then
  echoerr "エラー: 無効なタイムアウト '$TIMEOUT'"
  使用法 3
フィ

ケース「$PROTOCOL」
  通信プロトコル
    [ "$HOST" = "" ] || [ "$PORT" = "" ]の場合
      echoerr "エラー: テストするにはホストとポートを指定する必要があります。"
      使用法 2
    フィ
  ;;
  (http://www.facebook.com/Selenium)
    [ "$HOST" = "" ]の場合;
      echoerr "エラー: テストするホストを指定する必要があります。"
      使用法 2
    フィ
  ;;
エサック

wait_for "$@"

Docker-compose のdepends_on order問題の解決方法についてはこれで終わりです。Docker-compose のdepends_on orderに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • docker-compose で Jenkins をインストールする際の実践的なメモ
  • docker compose helloworld を使い始めるための詳細なプロセス
  • Docker Compose のインストールと使用手順
  • Docker Compose のサイドカーモードの詳細な説明

<<:  CSS 3.0 テキストホバージャンプ特殊効果コード

>>:  ウェブページで任意のフォントを使用する実践的な操作とデモ

推薦する

6つのレイアウトでのFrameLayoutの使用

序文前回はLinearLayoutについて説明しました。今回はFrameLayoutの使い方を説明し...

Nginx での SSL 証明書のインストールと展開手順の概要

目次問題の説明:インストール手順1. 準備2. サーバーにリモート接続する3. 証明書と秘密鍵ファイ...

MySQL データベースの集計クエリと結合クエリ操作

目次1. クエリ結果を挿入する2. 集計クエリ2.1 はじめに2.2 集計関数2.3 group b...

TypeScriptジェネリックの使用

目次1. 使いやすい2. 関数内でジェネリックを使用する3. クラス内でジェネリックを使用する4. ...

MySQLログに関する知識のまとめ

目次SQL実行順序ビンログ何ですかいつ生産されるのか何の役に立つんだディスクはいつドロップされますか...

Linux 上での MySQL データベースのリモート展開の詳細な手順

LinuxリモートMySQLデータベースの展開、参考までに、具体的な内容は次のとおりです。 1.0 ...

Momentsで写真を整理するためのCSSコード

まず、Moments を開いて、写真の数が異なるいくつかのレイアウトを確認するか、以下の例を参照して...

CentOS8 jdk8 / java8 のインストールチュートリアル(推奨)

序文最初はCentOS8でwgetを使ってダウンロードし、解凍して環境変数を設定するつもりだったので...

フォーム検証機能を実装するためのネイティブ js

目次開発の際には、機能を段階的に分析して実装することで、明確な考え方を保つことができます。 1. フ...

Vue+Router+Element でシンプルなナビゲーションバーを実装する

このプロジェクトでは、Vue+Router+Element の具体的なコードを共有して、シンプルなナ...

Docker 可視化グラフィックツール portainer の詳細な説明

目次1. ポーテナーの紹介2. Portainer アーキテクチャの概要3. Portainerのイ...

ショートビデオ(Douyin)の透かし除去ツールの実装コード

目次1. まず最初のリンクを取得する2. ブラウザでこのリンクを開いてください3. アドレスを開くと...

Ubuntu にグラフィック ドライバーが正常にインストールされたかどうかを確認する方法

次のコマンドを実行します: glxinfo | grep レンダリング結果が「はい」の場合、グラフィ...

MySQLのインデックスシステムがB+ツリーを使用する理由の分析

目次1. インデックスとは何ですか? 2. インデックスはなぜ必要なのでしょうか? 3. インデック...

MySQLは外部SQLスクリプトファイルのコマンドを実行します

目次1. SQLコマンドを含むSQLスクリプトファイルを作成する2. SQLスクリプトファイルを実行...