docker stack wait

01/06/2022

https://github.com/sudo-bmitch/docker-stack-wait/blob/main/docker-stack-wait.sh

exemple de docker-compose.yml pour tester

version: '3.7'
services:
    normal:
        image: busybox
        command: /bin/sh -c ":>/healthy; tail -f /dev/null"
        healthcheck:
            test: /bin/sh -c "[ -f /healthy ] && exit 0 || exit 1"
            interval: 15s
            start_period: 60s
            retries: 3

    slow:
        image: busybox:1.34
        command: /bin/sh -c "sleep 50; :>/healthy; tail -f /dev/null"
        healthcheck:
            test: /bin/sh -c "[ -f /healthy ] && exit 0 || exit 1"
            interval: 15s
            start_period: 60s
            retries: 3

    tooslow:
        image: busybox
        command: /bin/sh -c "sleep 300; :>/healthy; tail -f /dev/null"
        healthcheck:
            test: /bin/sh -c "[ -f /healthy ] && exit 0 || exit 1"
            interval: 15s
            start_period: 60s
            retries: 3

comment ça marche

  1. lorsqu'on deploie une stack :
    docker service inspect nous renvoie rien d'utile pour savoir si le service est deployé

  2. par contre lorsqu'on redeploie,
    ya un champ UpdateStatus.State = updating
    qui devient UpdateStatus.State = completed

  3. quand ça echoue à cause d'un healthcheck en erreur ça dit paused
    quand ça dit rollback_* c'est que ça fait un rollback
    quand un rollback echoue ça dit rollback_paused
    quand un rollback marche ça dit rollback_completed

commandes utiles

# detruire toutes les stacks
docker stack rm swarm

# lancer la stack
docker stack deploy --prune --with-registry-auth -c docker-compose.yml swarm

# attendre que ça win
docker-stack-wait.sh swarm
docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock sudobmitch/docker-stack-wait -f label=deploy.wait=true swarm

# voir le status des services
docker service inspect $(docker stack services -q swarm)
# ou mieux, mais ne parchera qu'apres un redeploiement (car sinon .UpdateStatus est null et ça plante)
docker service inspect -f '{{.UpdateStatus.State}}' $(docker stack services -q swarm)

# une fois que le service est ok, on peut checker le nombre de répliques 
docker service ls --format '{{.Replicas}}' --filter "id=ofakl80n44ki"