85 votes

Redémarrer un service dans la pile docker swarm

Quelqu'un sait-il s'il existe un moyen de faire en sorte que docker swarm redémarre un service qui fait partie d'une pile sans redémarrer la pile entière ?

121voto

Matt Points 5550

Faire docker stack deploy à nouveau pour moi, c'est le moyen de mettre à jour les services. Comme Réponse de François De plus, d'après mon expérience, cela ne met à jour que les services qui doivent l'être.

Mais parfois, il semble plus facile, lors des tests, de ne redémarrer qu'un seul service. Dans mon cas, j'ai dû effacer le volume et mettre à jour le service pour le démarrer comme s'il était neuf. Je ne suis pas sûr qu'il y ait un inconvénient à la méthode que je vais décrire. Je l'ai testée sur ma pile de développement et elle a très bien fonctionné pour moi.

Obtenez l'identifiant de service que vous voulez démolir, puis utilisez docker service update --force <id> pour forcer la mise à jour du service, ce qui le redéploie effectivement.

$ docker stack services <stack_name>
ID                  NAME              ...
3xrdy2c7pfm3        stack-name_api    ...

$ docker service update --force 3xrdy2c7pfm3

Le site --force forcera le service à se mettre à jour, ce qui entraînera son redémarrage.

0 votes

Est-ce que le docker service update --force <id> solution forcer la relecture du fichier pile/composition ? Je pose cette question parce que je veux effectivement remplacer le point d'entrée du conteneur de service une fois que la pile complète a déjà été déployée, mais redémarrer le service unique uniquement !

1 votes

Il ne met pas à jour les conteneurs fonctionnant sur les nœuds de travail. Cependant, elle met à jour les conteneurs uniquement sur le nœud manager.

0 votes

Ok, ni si j'exécute la même commande sur chaque noeud ?

80voto

lukewendling Points 959

Échelle à 0 et retour en arrière :

docker service scale myservice=0
docker service scale myservice=10

3 votes

Celui-ci est le seul qui force réellement un redémarrage. Merci !

1 votes

Je suis d'accord, le fait de forcer une mise à jour n'a pas redémarré le service pour moi, je ne sais pas pourquoi.

0 votes

Bien que cette méthode semble arrêter le service, celui-ci reste tapi dans les entrailles de la bête. Par exemple, j'obtiens "port déjà utilisé" lorsque je réduis le service et que j'essaie d'en lancer un autre qui utilise le même port.

16voto

François Maturel Points 2928

En regardant le docker stack documentation :

Description détaillée

Créer et mise à jour une pile à partir d'une composition ou d'un fichier dab sur le swarm

De cet article de blog : docker stack fonctionne de la même manière que docker compose . C'est idempotent . Si la pile est déjà déployée, docker stack deploy ne redémarre que les services dont le digest ou le tag a été mis à jour :

docker stack process

D'après mon expérience, lorsque je déploie à nouveau la même pile avec un service qui change, seul le service mis à jour sera redémarré .

MAIS... il semble y avoir certaines limites aux changements qui sont pris en compte (certains rapportent bogues avec les balises d'image ), alors faites un essai et voyez si cela fonctionne comme prévu.

Vous pouvez également utiliser service update si vous voulez être sûr que seul le service ciblé est mis à jour avec vos changements.

Vous pouvez également vous référer à ce similaire SO QA .

0 votes

Merci, cela fonctionne comme prévu. En fait, je cherche à forcer le redémarrage d'un service spécifique (ou de la pile entière) de manière continue. Malheureusement, certains services avec lesquels je travaille ont des problèmes d'invalidation de cache et nous avons besoin de supprimer/redéployer la pile pour forcer les mises à jour. En regardant les service update documentation que je pourrais ajouter ou supprimer env des variables pour faire semblant s'il n'y a pas de moyen intégré.

0 votes

Je cherchais justement la même chose - je n'ai rien trouvé dans la documentation.

1 votes

Je viens de rencontrer le problème suivant : docker stack deploy n'a pas voulu démarrer un service (openldap). Je n'ai pas pu trouver de fichier journal. docker-compose run <service> démarre le conteneur sans problème. Enfin, docker service update --force <servce> a fonctionné.

1voto

Robert Wasmann Points 361

Comme dans l'exemple de l documentation pour des mises à jour régulières :

$ docker service update --image redis:3.0.7 redis

Cependant, cela ne fonctionne que si votre image est déjà sur les machines locales. Si ce n'est pas le cas, vous devez utiliser --with-registry-auth pour envoyer les détails d'authentification du registre aux agents swarm. Voir les détails dans le documentation sur la mise à jour du service Docker.

$ docker service update --with-registry-auth --image redis:3.0.7 redis

-5voto

Xiaorong Liao Points 671

L'enlever :

docker stack rm stack_name

le redéployer :

docker stack deploy -c docker-compose.yml stack_name

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X