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 テキストホバージャンプ特殊効果コード

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

推薦する

MySQL 5.7.18 マスタースレーブレプリケーション設定(マスター 1 台とスレーブ 1 台)チュートリアルの詳細な説明

1. 複製原理マスター サーバーはバイナリ ログ ファイルに更新を書き込み、ログのローテーションを追...

Vueプロジェクトの最適化とパッケージ化の詳細な説明

目次序文1. ルーティングの遅延読み込み1. ルートの遅延読み込みが必要なのはなぜですか? 2. ル...

Ubuntu 18.04にMySQL 5.7をインストールする

この記事は MySQL 公式サイトを参考にしてまとめたものであり、遭遇したいくつかの問題も記録されて...

CentOS7 での MySQL 8.0.16 のインストールと設定のチュートリアル

MySQLの古いバージョンをアンインストールします(古いバージョンがない場合は、この手順をスキップし...

Vueコンポーネントの動的コンポーネントの詳細な説明

目次要約する要約する配列が変更されると、対応するデータを動的にロードしますシナリオ: 異なるコンポー...

ウェブページ上でデスクトップ exe プログラムを呼び出す簡単な方法

この記事では主に、Web ページ上でデスクトップ exe プログラムを呼び出す方法を紹介します。 W...

Vueはテーマ切り替えのための複数のアイデアを実装します

目次テーマを動的に変更する最初の方法: 動的コンポーネント2番目の方法はルーティング分離です要約する...

MySQL 制約の種類と例

制約制約によりデータの整合性と一貫性が確保される制約はテーブルレベルの制約と列レベルの制約に分けられ...

ローカルのMySQLをサーバーデータベースに移行する方法

Linux の scp コマンド (Windows では scp は使用できません) と、mysql...

Tcl言語に基づくシンプルなネットワーク環境を構成するプロセスの分析

1. Tclスクリプトファイルcircle.tclコードコメント #シミュレーションに必要なプロパテ...

Docker構成 Alibaba Cloud Container Serviceの操作

Alibaba Cloud Dockerコンテナサービスの設定Alibaba Cloud Image...

MySQL InnoDB 監視 (システム層、データベース層)

MySQL InnoDB 監視 (システム層、データベース層) MySQL の監視に関しては、My...

Dockerコマンドは一般ユーザーが実行できるように実装されている

dockerをインストールすると、通常はdockerユーザーグループが作成されます。ステップ2: 現...

Windows (x86、64 ビット) で MySQL 5.7.17 無料インストール バージョンをアップグレードするための詳細なチュートリアル

Laravel 5.4 のデフォルトの utf8mb64 文字エンコーディングをサポートするには、M...

MacにMySQLをインストールするときに忘れたパスワードを変更する方法

1. MacにMySQLデータベースをインストールする1. MySQLデータベースをダウンロードする...