实际项目中遇到的问题,eureka server若是在其余service后启动,会致使部分service一直没法注册成功,java
参考网上的经验,原文:https://www.jianshu.com/p/d2f39703bcb5,作下总结:docker
主要三种方式,其中第一种是无效的,可是不少博客没更新。shell
1. 用到了docker-compose 中的 restart
配置:restart: always
bash
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