How to start service only when other service had completed?
docker-compose
version 1.29 comes with build in functionality: service_completed_successfully
.
According to spec:
service_completed_successfully
- specifies that a dependency is expected to run to successful completion before starting a dependent service.
depends_on:
<service-name>:
condition: service_completed_successfully
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.
This is a supplement to @zooblin 's answer
Since docker-compose
version 1.29, we can do it by condition: service_completed_successfully
In your scene, database service start will cost some time, so the migration scripts should be executed after database fully started.
And the application service should start after migration scripts executed successfully.
the docker-compose.yaml
may be like following(here we use cassandra as exmaple, for other database, you can just modify healthcheck
commands):
version: '3.8'
services:
applicaion-service:
image: your-applicaion-service:0.0.1
depends_on:
cassandra-init-keyspace:
condition: service_completed_successfully
cassandra:
image: cassandra:4.0.1
ports:
- "9042:9042"
healthcheck:
test: ["CMD", "cqlsh", "-u cassandra", "-p cassandra" ,"-e describe keyspaces"]
interval: 15s
timeout: 10s
retries: 10
cassandra-init-keyspace:
image: cassandra:4.0.1
depends_on:
cassandra:
condition: service_healthy
volumes:
- ./src/main/resources/cassandra/init.cql:/init.cql
command: /bin/bash -c "echo loading cassandra keyspace && cqlsh cassandra -f /init.cql"