Weiß jemand, ob es eine Möglichkeit gibt, dass Docker Swarm einen Dienst, der Teil eines Stapels ist, neu startet, ohne den gesamten Stapel neu zu starten?
Antworten:
Doing docker stack deploy
für mich wieder der Weg zu Update - Dienste zu gehen. Nach Francois 'Antwort und auch nach meiner eigenen Erfahrung werden dadurch nur Dienste aktualisiert, die aktualisiert werden müssen.
Aber manchmal scheint es beim Testen einfacher zu sein, nur einen einzigen Dienst neu zu starten. In meinem Fall musste ich das Volume löschen und den Dienst aktualisieren, um ihn so zu starten, als wäre er frisch. Ich bin mir nicht sicher, ob die von mir beschriebene Methode einen Nachteil hat. Ich habe es auf meinem Entwicklungsstapel getestet und es hat großartig für mich funktioniert.
Rufen Sie die Dienst-ID ab, die Sie herunterfahren möchten, und docker service update --force <id>
erzwingen Sie dann die Aktualisierung des Dienstes, der ihn effektiv erneut bereitstellt
$ docker stack services <stack_name>
ID NAME ...
3xrdy2c7pfm3 stack-name_api ...
$ docker service update --force 3xrdy2c7pfm3
Das --force
Flag erzwingt eine Aktualisierung des Dienstes und führt zu einem Neustart.
Auf 0 skalieren und sichern:
docker service scale myservice=0
docker service scale myservice=10
Betrachten Sie die docker stack
Dokumentation:
Erweiterte Beschreibung
Erstellen und aktualisieren Sie einen Stapel aus einer Compose- oder einer Tupferdatei auf dem Schwarm
Aus diesem Blog-Artikel : docker stack
funktioniert ähnlich wie docker compose
. Es ist idempotent . Wenn der Stack bereits bereitgestellt ist, docker stack deploy
werden nur die Dienste neu gestartet, deren Digest oder Tag aktualisiert wurde:
Nach meiner Erfahrung wird nur der aktualisierte Dienst neu gestartet , wenn ich denselben Stack mit einem sich ändernden Dienst erneut bereitstelle .
ABER ... es scheint einige Einschränkungen für Änderungen zu geben, die berücksichtigt werden (einige melden Fehler mit Bild-Tags ). Probieren Sie es also aus und prüfen Sie, ob es wie erwartet funktioniert.
Sie können auch verwenden, service update
wenn Sie sicher sein möchten, dass nur ein gezielter Dienst mit Ihren Änderungen aktualisiert wird.
Sie können sich auch auf diese ähnliche SO-Qualitätssicherung beziehen .
service update
ich mir die Dokumentation anschaue, könnte ich env
Variablen hinzufügen / entfernen , um sie zu fälschen, wenn es keine eingebaute Methode gibt.
docker stack deploy
festgestellt : Ich würde keinen Dienst starten (openldap). Ich konnte keine Protokolldatei finden. docker-compose run <service>
würde den Container ohne Probleme starten. Endlich docker service update --force <servce>
hat funktioniert.
Gemäß dem Beispiel in der Dokumentation für fortlaufende Updates:
$ docker service update --image redis: 3.0.7 redis
Dies funktioniert jedoch nur, wenn sich Ihr Image bereits auf den lokalen Computern befindet. Wenn nicht, müssen Sie --with-registry-auth verwenden, um Registrierungsauthentifizierungsdetails an die Schwarmagenten zu senden. Weitere Informationen finden Sie in der Dokumentation zum Docker-Service-Update.
$ docker service update --with-registry-auth --image redis: 3.0.7 redis
entfernen Sie es:
docker stack rm stack_name
Stellen Sie es erneut bereit:
docker stack deploy -c docker-compose.yml stack_name