¿Alguien sabe si hay una manera de hacer que el enjambre de docker reinicie un servicio que es parte de una pila sin reiniciar toda la pila?
Respuestas:
Hacerlo de docker stack deploynuevo para mí es el camino a seguir para actualizar los servicios. Como Respuesta de Francois , y también en mi propia experiencia, al hacerlo, solo se actualizan los servicios que deben actualizarse.
Pero a veces, al probar cosas, parece más fácil reiniciar un solo servicio. En mi caso, tuve que borrar el volumen y actualizar el servicio para iniciarlo como si estuviera nuevo. No estoy seguro de si hay desventajas en el método que describiré. Lo probé en mi pila de desarrollo y funcionó muy bien para mí.
Obtenga la identificación del servicio que desea eliminar y luego úselo docker service update --force <id>para forzar la actualización del servicio que lo vuelve a implementar de manera efectiva
$ docker stack services <stack_name>
ID NAME ...
3xrdy2c7pfm3 stack-name_api ...
$ docker service update --force 3xrdy2c7pfm3
La --forcebandera forzará la actualización del servicio y se reiniciará.
Escalar a 0 y realizar una copia de seguridad:
docker service scale myservice=0
docker service scale myservice=10
Mirando la docker stackdocumentación:
Descripción ampliada
Cree y actualice una pila a partir de un archivo de composición o dab en el enjambre
De este artículo de blog : docker stackfunciona de manera similar a docker compose. Es idempotente . Si la pila ya está implementada, docker stack deployreiniciará solo aquellos servicios que tengan el resumen o la etiqueta que se actualizó:
Según mi experiencia, cuando vuelvo a implementar la misma pila con un cambio de servicio, solo se reiniciará el servicio actualizado .
PERO ... parece haber algunas limitaciones para los cambios que se tienen en cuenta (algunos informan errores con etiquetas de imagen ), así que pruébelo y vea si funciona como se esperaba.
También puede usarlo service updatesi desea asegurarse de que solo el servicio dirigido si se actualiza con sus cambios.
service updatedocumentación, podría agregar / eliminar envvariables para falsificarlo si no hay una forma integrada.
docker stack deployno iniciaría un servicio (openldap). No pude encontrar un archivo de registro. docker-compose run <service>pondría en marcha el contenedor sin problema. Finalmente, docker service update --force <servce>funcionó.
Según el ejemplo en la documentación para actualizaciones continuas:
$ docker service update --image redis: 3.0.7 redis
Sin embargo, eso solo funciona si su imagen ya está en las máquinas locales. De lo contrario, debe usar --with-registry-auth para enviar los detalles de autenticación del registro a los agentes del enjambre. Consulte los detalles en la documentación de actualización del servicio de Docker.
$ docker service update --with-registry-auth --image redis: 3.0.7 redis
eliminarlo:
docker stack rm stack_name
redistribuirlo:
docker stack deploy -c docker-compose.yml stack_name