zoukankan      html  css  js  c++  java
  • Docker-compose编排微服务顺序启动解决方案

    实际项目中遇到的问题,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 ! 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
    
    乌龟虽然跑的慢但是比兔子长寿啊
  • 相关阅读:
    adb root : adbd cannot run as root in production builds
    通过adb shell操作android真机的SQLite数据库
    基金--智能定投
    使用注册表优化终端、编辑器的中英字体混合显示,如「Consolas + 雅黑」「Monaco + 雅黑」
    诗词中的雨
    最好的PHP博客系统
    [重要更新][Quartus II][14.1正式版]
    解决Xilinx ISE在Win8下打开崩溃闪退的方法
    THE CUSTOMISER
    RAD Studio 2010~XE8 官方 ISO 下载地址 (2015-03-28更新)
  • 原文地址:https://www.cnblogs.com/nieqibest/p/9826940.html
Copyright © 2011-2022 走看看