我有三个服务(db,app1,app2)和两个VM(dockervm1,dockervm2)。使用swarm模式我在vm1上生成了db和app1,在vm2上生成了app2。
当db容器启动时,它会创建一个数据库。现在我想在创建db并填充数据后启动服务app1和app2。我尝试将db设置为app1和app2的依赖项。但是,db容器被认为是在容器启动时创建的,而不是在创建实际数据库时创建的。所以app1和app2在db创建后不久就会开始运行。
有没有办法告诉docker只有在创建了所有必需的表后才开始考虑db container? 有没有一种方法,db容器可以创建一个文件来表示它已完成创建表并使文件可用于app1和app2,即使它们位于不同的VM上?
答案 0 :(得分:0)
一种解决方案是在您的应用容器中使用一个循环,直到数据库可用。例如:
while ! mysql -u dbuser -p secretpassword -e 'select 1 from sometable' mydb; do
sleep 1
done
仅在while
循环退出后启动应用程序。
或者,如果您是应用程序开发人员,只需在应用程序本身中包含必要的重试逻辑。