国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 服務器 > Web服務器 > 正文

docker compose 服務啟動順序控制的方法

2024-09-01 13:55:41
字體:
來源:轉載
供稿:網友

概要

docker-compose 可以方便組合多個 docker 容器服務, 但是, 當容器服務之間存在依賴關系時, docker-compose 并不能保證服務的啟動順序.

docker-compose 中的 depends_on 配置是容器的啟動順序, 并不是容器中服務的啟動順序.

問題重現

首先, 我們構造一個示例, 來演示 docker-compose 帶來的問題. docker-compose.yml 文件如下:

version: '2'services: web:  image: ubuntu:14.04  depends_on:   - web  command: nc -z database 3306 database:  image: ubuntu:14.04  command: >   /bin/bash -c '   sleep 5;   echo "sleep over";   nc -lk 0.0.0.0 3306;   '

啟動后, 可以發現, 確實是先啟動 database, 后啟動 web, 但是 database 中的服務是在大約 5 秒后才完成的, 所以導致 web 的啟動失敗.

$ docker-compose upCreating tmp_database_1 ... doneCreating tmp_database_1 ...Creating tmp_web_1   ... doneAttaching to tmp_database_1, tmp_web_1tmp_web_1 exited with code 1database_1 | sleep over

問題解決方式 1.0

修改 web 的啟動腳本, 等待 database 的端口通了之后再啟動服務

version: '2'services: web:  image: ubuntu:14.04  depends_on:   - database  command: >   /bin/bash -c '   while ! nc -z database 3306;   do    echo "wait for database";    sleep 1;   done;   echo "database is ready!";   echo "start web service here";   ' database:  image: ubuntu:14.04  command: >   /bin/bash -c '   sleep 5;   echo "sleep over";   nc -lk 0.0.0.0 3306;   '

再次啟動,

$ docker-compose upCreating tmp_database_1 ... doneCreating tmp_database_1 ...Creating tmp_web_1   ... doneAttaching to tmp_database_1, tmp_web_1web_1    | wait for databaseweb_1    | wait for databaseweb_1    | wait for databaseweb_1    | wait for databaseweb_1    | wait for databasedatabase_1 | sleep overweb_1    | database is ready!web_1    | start web service heretmp_web_1 exited with code 0

web 會在 database 啟動完成, 端口通了之后才啟動.

問題解決方式 2.0

上面的解決方式雖然能夠解決問題, 但是在 yaml 中直接插入腳本不好維護, 也容易出錯. 如果有多個依賴, 或者多層依賴的時候, 復雜度會直線上升.

所以, 要封裝一個 entrypoint.sh 腳本, 可以接受啟動命令, 以及需要等待的服務和端口. 腳本內容如下:

#!/bin/bash#set -x#******************************************************************************# @file  : entrypoint.sh# @author : wangyubin# @date  : 2018-08- 1 10:18:43## @brief  : entry point for manage service start order# history : init#******************************************************************************: ${SLEEP_SECOND:=2}wait_for() {  echo Waiting for $1 to listen on $2...  while ! nc -z $1 $2; do echo waiting...; sleep $SLEEP_SECOND; done}declare DEPENDSdeclare CMDwhile getopts "d:c:" argdo  case $arg in    d)      DEPENDS=$OPTARG      ;;    c)      CMD=$OPTARG      ;;    ?)      echo "unkonw argument"      exit 1      ;;  esacdonefor var in ${DEPENDS//,/ }do  host=${var%:*}  port=${var#*:}  wait_for $host $portdoneeval $CMD

這個腳本有 2 個參數, -d 需要等待的服務和端口, -c 等待的服務和端口啟動之后, 自己的啟動命令

修改 docker-compose.yml, 使用 entrypoint.sh 腳本來控制啟動順序.

version: '2'services: web:  image: ubuntu:14.04  depends_on:   - database  volumes:   - "./entrypoint.sh:/entrypoint.sh"  entrypoint: /entrypoint.sh -d database:3306 -c 'echo "start web service here"'; database:  image: ubuntu:14.04  command: >   /bin/bash -c '   sleep 5;   echo "sleep over";   nc -lk 0.0.0.0 3306;   '

實際使用中, 也可以將 entrypoint.sh 打包到發布的鏡像之中, 不用通過 volumes 配置來加載 entrypoint.sh 腳本.

測試結果如下:

$ docker-compose upStarting tmp_database_1 ... doneStarting tmp_web_1 ... doneAttaching to tmp_database_1, tmp_web_1web_1    | Waiting for database to listen on 3306...web_1    | waiting...web_1    | waiting...web_1    | waiting...database_1 | sleep overweb_1    | start web service heretmp_web_1 exited with code 0

補充

依賴多個服務和端口

使用上面的 entrypoint.sh 腳本, 也可以依賴多個服務和端口, -d 參數后面的多個服務和端口用逗號(,)隔開.

version: '2'services: web:  image: ubuntu:14.04  depends_on:   - mysql   - postgresql  volumes:   - "./entrypoint.sh:/entrypoint.sh"  entrypoint: /entrypoint.sh -d mysql:3306,postgresql:5432 -c 'echo "start web service here"'; mysql:  image: ubuntu:14.04  command: >   /bin/bash -c '   sleep 4;   echo "sleep over";   nc -lk 0.0.0.0 3306;   ' postgresql:  image: ubuntu:14.04  command: >   /bin/bash -c '   sleep 8;   echo "sleep over";   nc -lk 0.0.0.0 5432;   '

執行的效果可以自行嘗試.

嘗試間隔的配置

每次嘗試連接的等待時間可以通過 環境變量 SLEEP_SECOND 來配置, 默認 2 秒 下面的配置等待時間設置為 4 秒, 就會每隔 4 秒才去嘗試 mysql 服務時候可連接.

version: '2'services: web:  image: ubuntu:14.04  environment:   SLEEP_SECOND: 4  depends_on:   - mysql  volumes:   - "./entrypoint.sh:/entrypoint.sh"  entrypoint: /entrypoint.sh -d mysql:3306 'echo "start web service here"'; mysql:  image: ubuntu:14.04  command: >   /bin/bash -c '   sleep 4;   echo "sleep over";   nc -lk 0.0.0.0 3306;   '

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到服務器教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 华蓥市| 古田县| 尤溪县| 宁强县| 龙海市| 如皋市| 伊宁县| 沈丘县| 八宿县| 桑日县| 宽城| 普格县| 正阳县| 镇平县| 尚志市| 横峰县| 遂平县| 巴楚县| 柘荣县| 突泉县| 信宜市| 新余市| 毕节市| 株洲县| 东乡县| 章丘市| 西城区| 林周县| 邵阳县| 通道| 普安县| 松溪县| 岳池县| 鹤岗市| 潮安县| 长寿区| 拉萨市| 彭泽县| 洛南县| 上虞市| 库伦旗|