如何仅在其他服务完成后启动服务?

时间:2018-01-04 09:47:59

标签: docker docker-compose

使用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是否具有执行此操作的功能,还是应该考虑使用其他方法?

3 个答案:

答案 0 :(得分:2)

对于那些正在寻找答案的人,仍然没有针对此问题的现成解决方案。

一种解决方法是使用包装器脚本:https://docs.docker.com/compose/startup-order/

在Robert的情况下,您可以想象一个脚本循环并等待直到无法再对数据库服务执行ping操作(直到服务停止为止)。

答案 1 :(得分:2)

Docker compose还没有任何现成的解决方案。
但是,存在许多解决此问题的好方法。

更好的解决方案之一是将服务发现用作Consul中实现的Autopilot modelJoyent Containerpilot

即使在根本不存在服务依赖关系的docker swarm集群中,该模型也允许实现服务之间的依赖关系。

Containerpilot作业模型允许创建简单的脚本以使启动的服务保持正确的顺序。

答案 2 :(得分:1)

docker-compose 1.29 版带有 build in functionalityservice_completed_successfully。 根据{{​​3}}:

<块引用>

service_completed_successfully - 指定依赖项在启动依赖项服务之前应该运行到成功完成。

depends_on:
  <service-name>:
    condition: service_completed_successfully