Docker-compose編排微服務順序啟動解決方案
阿新 • • 發佈:2018-10-31
實際專案中遇到的問題,eureka server如果在其他service後啟動,會導致部分service一直無法註冊成功,
參考網上的經驗,原文:https://www.jianshu.com/p/d2f39703bcb5,做下總結:
主要三種方式,其中第一種是無效的,但是很多部落格沒更新。
1. 用到了docker-compose 中的 restart
配置:restart: always
2. 拆分原來的docker-compose.yml,分成兩部分部署, 將要先啟動的服務放在一個docker-compose中,後啟動的服務放在第二個docker-compose中,
啟動兩次,需要在networks標籤中指定兩者使用同一個網路。
$ docker-compose -f docker-compose-commond.yml up
3. 同步等待,使用shell指令碼阻止當前服務啟動,直到所需依賴的服務全部啟動之後再啟動當前服務。docker-compose檔案中在服務下加入entrypoint,注:這種寫法會覆蓋dockerfile中的entrypoint和cmd,一定要注意!
volumes: - "./entrypoint.sh:/entrypoint.sh" environment: SLEEP_SECOND: 4 tty: true entrypoint: /entrypoint.sh -d simonEureka:8100 -c 'java -jar config-server.jar';
entrypoint.sh如下,網上抄來的,可以根據需求自行定製:
#!/bin/bash : ${SLEEP_SECOND:=2} #預設兩秒後重試 wait_for() { echo Waiting for $1 to listen on $2... while ! nc -z $1 $2; #nc命令用telnet協議測試埠 do echo waiting...; sleep $SLEEP_SECOND; done } declare DEPENDS declare CMD while getopts "d:c:" arg do case $arg in d) DEPENDS=$OPTARG ;; c) CMD=$OPTARG ;; ?) echo "unkonw argument" exit 1 ;; esac done for var in ${DEPENDS//,/ } ### ${DEPENDS//,/ }把DEPENDS中的,替換為空格 do host=${var%:*} port=${var#*:} wait_for $host $port done eval $CMD ##eval命令相當於把$CMD中的命令執行一次 #避免執行完命令之後退出容器 tail -f /dev/null