2017-09-04 126 views
0

我有三个服务(db,app1,app2)和两个虚拟机(dockervm1,dockervm2)。使用swarm模式,我在vm2上生成了db和app1,而在vm2上生成了app1。协调在群模式下启动容器

db容器启动时,它会创建一个数据库。现在我想在创建数据库并填充数据后启动服务app1和app2。我尝试将db设置为app1和app2的依赖项。但是,一旦容器启动,db容器就被视为创建,而不是在创建实际数据库时创建。所以app1和app2在db创建后不久就会开始。

有没有办法告诉码头考虑db容器启动后才创建所有必要的表? 有没有一种方法,db容器可以创建一个文件来表示它已完成创建表并使文件可用于app1和app2,即使它们位于不同的虚拟机上?

回答

0

一个解决方案是在您的应用容器中使用一个循环,直到数据库可用为止。例如,像:

while ! mysql -u dbuser -p secretpassword -e 'select 1 from sometable' mydb; do 
    sleep 1 
done 

只有启动while循环退出后的应用程序。

或者,如果您是应用程序开发人员,只需在应用程序本身中包含必要的重试逻辑即可。

相关问题