How to start service only when other service had c

2019-04-07 00:31发布

问题:

Using compose I want to start a service only after another service has exited with code 0.

I have mutiple needs for this functionality. The basic need is where I have:

  • database service
  • database migration service
  • application service

The database service will start an empty database. My app needs it's schema setup in the database so I have a second service which will do this when it is run. When it is done this service will exit successfully - I can see this in my docker compose log file:

webservices_kong-migration_1 exited with code 0

I do not want the application service to start until after the database migration has completed.

I have the following in my docker-compose file for the application service:

depends_on:
  kong-database:
    condition: service_healthy
  kong-migration:
    condition: service_started

I know this is wrong because I can see in my docker-compose log that the application is started after the migration has started but before it has completed, causing the application to fail.

(I have been taking https://github.com/Kong/docker-kong/blob/master/compose/docker-compose.yml as an example)

Does docker-compose have functionality to do this or should I be considering another method?

回答1:

Docker compose haven't any out-of-the-box solutions.
But exists a number of good implementations for solving this problem.

One of the better solutions is using service discovery as Consul and Autopilot model implemented in Joyent Containerpilot.

This model allows implementing dependencies between services even in docker swarm cluster where service dependency does not exist at all.

Containerpilot jobs model allow creating simple scripts to keep started services in the right order.



回答2:

For those who are looking for an answer, there're still no out-of-the-box solutions for this.

A workaround solution consists in using a wrapper script : https://docs.docker.com/compose/startup-order/

In Robert's case, you can imagine a script that loops and waits until the database service can no more be pinged (until the services has stopped).