有些场景需要控制 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 | FROM openjdk:8-jre-alpine |
build 完之后替换原来镜像, 改写执行命令, 比如 Zuul 依赖 Eureka Server
1 | zuul: |
docker-compose 启动后, 会出现类似信息
1 | zuul | 2018/12/12 08:04:37 Waiting for: tcp://eureka-server:8761 |
等 Eureka Server 启动完, Zuul 才启动