在docker-compose的配置文件中,通过配置depends_on
, links
, volumes_from
, 以及 network_mode: "service:..."
.可以控制服务的启动顺序,但是却不能知道被依赖的服务是否启动完毕,在一个服务必须要依赖另一个服务完成的时候,这样就会有问题。
比如在微服务需要依赖微服务配置中心,在配置中心没有加载完毕的时候,微服务就会出现无法加载配置的错误。
这个问题,官网的文档上有描述
解决的办法有以下几种:
1、足够的容错和重试机制,比如连接数据库,在初次连接不上的时候,服务消费者可以不断重试,直到连接上位置
2、docker-compose拆分,分成两部分部署,将要先启动的服务放在一个docker-compose中,后启动的服务放在两一个docker-compose中,启动两次,两者使用同一个网络。
3、同步等待,使用
wait-for-it.sh
或者其他shell
脚本将当前服务启动阻塞,直到被依赖的服务加载完毕
wait-for-it
的github地址为:wait-for-it
改写后的docker-compose如下:
version: "2"
services:
web:
build: .
ports:
- "80:8000"
depends_on:
- "db"
command: ["./wait-for-it.sh", "db:5432", "--", "python", "app.py"]
db:
image: postgres