A script to wait for a service running in docker swarm
For docker stack deploy
there is no option to wait while all services are in running state.
With docker service ps
it’s possible to find desired state
and current state
for one service for each node.
$ docker service ps redis
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
50qe8lfnxaxk redis.1 redis:3.0.6 manager1 Running Running 6 seconds ago
ky2re9oz86r9 \_ redis.1 redis:3.0.5 manager1 Shutdown Shutdown 8 seconds ago
3s46te2nzl4i redis.2 redis:3.0.6 worker2 Running Running less than a second ago
nvjljf7rmor4 \_ redis.2 redis:3.0.6 worker2 Shutdown Rejected 23 seconds ago
To check if service is running on all nodes, it’s necessary to filter all tasks by desired state
in ready or running
and then check that they all have current state
in running.
docker service ps -f desired-state=running -f desired-state=ready --format "{{ .DesiredState }} {{.CurrentState }}" my_service | grep -v "Running Running"
To run this in a loop.
check_running() {
docker service ps -f desired-state=running -f desired-state=ready --format "{{ .DesiredState }} {{.CurrentState }}" my_service | grep -v "Running Running"
}
ATTEMPTS=0
RESULT=0
until [ $RESULT -eq 1 ] || [ $ATTEMPTS -eq 3 ]; do
sleep 30
check_running
RESULT=$?
ATTEMPTS=$((ATTEMPTS + 1))
done
set -e
test $RESULT -eq 1