Docker-compose編排微服務順序啓動解決方案

實際項目中遇到的問題,eureka server若是在其餘service後啓動,會致使部分service一直沒法註冊成功,java

參考網上的經驗,原文:https://www.jianshu.com/p/d2f39703bcb5,作下總結:docker

主要三種方式,其中第一種是無效的,可是不少博客沒更新。shell

1. 用到了docker-compose 中的 restart配置:restart: alwaysbash

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,必定要注意!rest

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以下,網上抄來的,能夠根據需求自行定製:code

#!/bin/bash

: ${SLEEP_SECOND:=2} #默認兩秒後重試
wait_for() { 
	echo Waiting for $1 to listen on $2...
	while ! ncat -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
相關文章
相關標籤/搜索