使用compose我想在另一个服务退出代码0之后才启动服务。
我对此功能有多重需求。基本需求是我所拥有的:
数据库服务将启动一个空数据库。我的应用程序需要它在数据库中的架构设置,所以我有第二个服务,它将在运行时执行此操作。完成后,此服务将成功退出 - 我可以在我的docker撰写日志文件中看到:
webservices_kong-migration_1退出,代码为0
我不希望应用程序服务在 数据库迁移完成之后启动。
我在应用程序服务的docker-compose文件中有以下内容:
depends_on: kong-database: condition: service_healthy kong-migration: condition: service_started
我知道这是错误的,因为我可以在我的docker-compose日志中看到应用程序在迁移开始后但在它完成之前启动,导致应用程序失败。
(我一直以https://github.com/Kong/docker-kong/blob/master/compose/docker-compose.yml为例)
docker-compose是否具有执行此操作的功能,还是应该考虑使用其他方法?
答案 0 :(得分:2)
对于那些正在寻找答案的人,仍然没有针对此问题的现成解决方案。
一种解决方法是使用包装器脚本:https://docs.docker.com/compose/startup-order/
在Robert的情况下,您可以想象一个脚本循环并等待直到无法再对数据库服务执行ping操作(直到服务停止为止)。
答案 1 :(得分:2)
Docker compose还没有任何现成的解决方案。
但是,存在许多解决此问题的好方法。
更好的解决方案之一是将服务发现用作Consul中实现的Autopilot model和Joyent Containerpilot。
即使在根本不存在服务依赖关系的docker swarm集群中,该模型也允许实现服务之间的依赖关系。
Containerpilot作业模型允许创建简单的脚本以使启动的服务保持正确的顺序。
答案 2 :(得分:1)
docker-compose
1.29 版带有 build in functionality:service_completed_successfully
。
根据{{3}}:
service_completed_successfully
- 指定依赖项在启动依赖项服务之前应该运行到成功完成。
depends_on:
<service-name>:
condition: service_completed_successfully