控制Docker容器启动顺序

有些场景需要控制 Docker 容器的启动顺序, 比如一个后端服务要依赖 MySQL、Redis、RabbitMQ 等, 又或者 Eureka Client 一定要在 Eureka Server 启动后才能连接、从 Config Server 获取配置等

Docker 提供了 depends_on 等东西, 顾名思义就是处理依赖关系的, 但其实并不是

比如有 A、B, B depends_on A, 容器启动时, Docker 会确保先启动 A 再启动 B, 但是可能 B 启动完了 A 还在启动, 它并不能保证 A 启动完了 B 才启动, 详情 -> Control startup order in Compose

Docker 推荐了几个非官方工具, 都试过后, 发现只有dockerize能用

wait-for-it.sh

这玩意不兼容 alpine, 直接报错

wait-for

这玩意说是兼容了 alpine, 但是使用过程中全部请求都超时无法进行下一步, 不知道是不是打开方式不对

dockerize

只需要加入到容器中运行即可, 不想手动加的可以自己 build 一个镜像出来

首先给dockerize加执行权限, 然后编写 Dockerfile

1
2
3
FROM openjdk:8-jre-alpine

ADD dockerize /dockerize

build 完之后替换原来镜像, 改写执行命令, 比如 Zuul 依赖 Eureka Server

1
2
3
zuul:
image: 你刚build的镜像
command: ./dockerize -wait tcp://eureka-server:8761 -- java -jar -Xms64m -Xmx64m /zuul.jar

docker-compose 启动后, 会出现类似信息

1
2
3
4
5
zuul    | 2018/12/12 08:04:37 Waiting for: tcp://eureka-server:8761
...
zuul_1 | 2018/12/12 08:04:42 Problem with dial: dial tcp 172.17.0.1:8761: connect: connection refused. Sleeping 1s
...
zuul_1 | 2018/12/12 08:27:10 Connected to tcp://eureka-server:8761

等 Eureka Server 启动完, Zuul 才启动