协调集群模式下的容器启动

我有三个服务(db,app1,app2)和两个虚拟机(dockervm1,dockervm2)。 使用swarm模式,我在vm2上生成了db和app1,在vm2上生成了app1。

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

有没有办法告诉docker考虑db容器启动一旦完成创build所有必要的表? 有没有一种方法的数据库容器可以创build一个文件来表明它已经完成创build表,并使文件可用于app1和app2,即使他们在不同的虚拟机上?

一种解决scheme是在您的应用程序容器中使用一个循环,直到数据库可用为止。 例如,像这样的东西:

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

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

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