Docker-Container vor Neustart der DS sauber beenden

  • Ab sofort steht euch hier im Forum die neue Add-on Verwaltung zur Verfügung – eine zentrale Plattform für alles rund um Erweiterungen und Add-ons für den DSM.

    Damit haben wir einen Ort, an dem Lösungen von Nutzern mit der Community geteilt werden können. Über die Team Funktion können Projekte auch gemeinsam gepflegt werden.

    Was die Add-on Verwaltung kann und wie es funktioniert findet Ihr hier

    Hier geht es zu den Add-ons

Status
Für weitere Antworten geschlossen.

Tom80

Benutzer
Registriert
06. Okt. 2015
Beiträge
137
Reaktionspunkte
2
Punkte
18
Hallo,

Ich habe den Fotoserver Picapport in einem Docker-Container laufen.
Wenn ich jetzt z.B. bei einem Update der DS einen Neustart machen muss, muss ich vorher dran denken den Container sauber zu beenden, sonst wird mir die Datenbank von Picapport zerschossen und ich muss diese neu aufbauen lassen, was jedesmal viel Zeit in Anspruch nimmt.

Gibt es hierfür eine Möglichkeit vor einem Neustart den Docker-Container sauber beenden zu lassen?

Tom
 
Du kannst auf der Shell als root die Datei "/var/packages/Docker/scripts/start-stop-status" bearbeiten.

In den Zeilen 220ff findest Du die Aktionen zum Anhalten: "stop)".

In der Zeile dadrunter kannst Du folgenden Befehl einfügen, der alle laufenden Docker-Container beendet, bevor das Docker Paket beendet wird:
Code:
docker stop $(docker qs -q)

Du musst mal schauen, ob das Auswirkungen auf den Autostart von Containern hat (je nach dem welchen Modus Synology da setzt, hat es keine Auswirkungen oder eben doch).
 
... oder die Zeile über den Aufgabenplaner, ausgelöst durch Herunterfahren, ausführen lassen. Vorteil: die Änderung am Start-stop-Skrip übersteht wahrscheinlich ein Update nicht (und irgendwann vergisst man die Anpassung).

@haydibe:
In der Zeile dadrunter kannst Du folgenden Befehl einfügen, der alle laufenden Docker-Container beendet, bevor das Docker Paket beendet wird:
Code:
docker stop $(docker qs -q)

Ich gehe mal davon aus, dass du so meinst :):
Rich (BBCode):
docker stop $(docker ps -q)

Allerdings wird bei mir (bis auf Bitwarden - steht als erstes in der Liste) ein unerwartetes Beenden der Container angemängelt.
Bildschirmfoto 2018-12-13 um 12.46.18.png



@haydibe:
Der Befehl 'pause' hält den Container, ohne eine entsprechende Warnmeldung auszugeben. Wäre ein Beenden in diesem Zustand ein Risiko für die Datenkonsistenz?
 
Zuletzt bearbeitet:
Der Shutdown-Task ist viel charmenter! Danke auch für die Korrektur vom Typo :)

Hmm, Container deren Prozesse mit Docker pause eingefroren wurden, haben ihren Zustand immer noch im Arbeitsspeicher.
Das kann man einsetzen, wenn ein Container gerade viel Last erzeugt und man die CPU für etwas anderes frei machen will. Einen Restart übersteht der In-Memory-State aber nicht.

Und hier haben wir auch nochmal den Weg über die Synology-Webapi:
Code:
for container in $(docker ps --format "{{ .Names }}"); do
 /usr/syno/bin/synowebapi --exec api=SYNO.Docker.Container version=1 method=stop name="$container"
done
 
Zuletzt bearbeitet:
Sehr schön - vielen Dank :)
Das funktioniert ohne Fehlermeldung.

Wo hast du denn die Synology-WebAPI ausgegraben?
Gibt es dazu eine Doku?
 
Danke für die ganzen antworten!
Ich werde das mal testen und mich wieder melden.

Tom
 
Mal grundsätzliche Frage dazu: bedeutet dies, dass das DSM die Docker-Instanzen nicht automatisch beendet und sauber runterfährt?

Michael
 
In der Datei /var/packages/Docker/scripts/start-stop-status gibt es im stop) Block folgende Zeile:
Code:
/usr/syno/bin/synowebapi --exec api=SYNO.Docker.DDSM method=stop version=1

Wenn ich die Zeile in einer Root-Shell ausführt, erhalte ich folgendes zurück:
[Line 259] Exec WebAPI: api=SYNO.Docker.DDSM, version=1, method=stop, param={}, runner=
Code:
{
   "data" : {},
   "httpd_restart" : false,
   "success" : true
}

Danach laufen alle Container aber weiter...


Es muss aber noch irgendeinen Mechanismus geben, da bei einem Reboot des NAS keine Fehlermeldungen im Log sind und ich bisher noch keine Korrupten-Daten in den Volumes hatte.


Trotzdem wirkt das Ganze wie ein Bug. Die von mir oben angegebene Schleife sollte in ähnlicher Form im stop)-Block zu finden sein... Ist sie aber nicht.
 
api=SYNO.Docker.DDSM
Ich würde vermuten, das er damit wirklich nur ein evtl installiertes DDSM stoppt. Für die "normalen" Container gibt es evtl. was anderes.
 
Das passt aber wieder nicht zu seiner Beobachtung:
… Wenn ich die Zeile in einer Root-Shell ausführt, erhalte ich folgendes zurück:
[Line 259] Exec WebAPI: api=SYNO.Docker.DDSM, version=1, method=stop, param={}, runner=

Danach laufen alle Container aber weiter...
 
Ich meine das ist ganau das. Die normalen Container laufen weiter, weil nur der DDSM Container gestoppt würde.
 
Achso - jetzt sehe ich es auch. Docker DSM :rolleyes:
Ich dachte in meiner Oberfläschlichkeit, du meinst, dass zwar das Paket Docker beendet wird, aber nicht die Container.


Nachtrag:
Docker DSM lässt sich damit beenden. Die Ausgabe ist:
Rich (BBCode):
root@DS:~# /usr/syno/bin/synowebapi --exec api=SYNO.Docker.DDSM method=stop version=1
[Line 259] Exec WebAPI:  api=SYNO.Docker.DDSM, version=1, method=stop, param={}, runner=
{
   "data" : {
      "containers" : [ "DDSM1" ]
   },
   "httpd_restart" : false,
   "success" : true
}
 
Zuletzt bearbeitet:
Ich war unachtsam. Es ist tatsächlich so, dass nur DDSM beendet wird und nicht die normalen Container. Da ich bei mir kein DDSM laufen habe, ergibt es auch Sinn, dass bei mir Ausgabe leer war.

Was es tatsächlich tut ist DDSM beenden und danach das Docker Package "deaktivieren".
Ein explizites beenden der Container gibt es nicht!

Irgendwie gruselig. Wenn ich wetten müsste, würde ich mein Geld auf "der Docker-Daemon beendet laufende Container beim erhalten von SIGTER, bevor sich der Prozess beendet" setzen. Aber wissen tue ich es nicht.
 
Zuletzt bearbeitet:
Hallo,

Danke für die antworten.
Leider hilft mir das nichts, da das Script im Container beim beenden nicht sauber beendet wird bringt mir das alles nichts.

Tom
 

Leider hilft mir das nichts, da das Script im Container beim beenden nicht sauber beendet wird bringt mir das alles nichts.

Warum?
Der Befehl aus Beitrag #4 funktioniert bei dir nicht?
Er sollte das Gleiche bewirken, wie ein Beenden über die GUI, was ja bei dir wiederum funktioniert.
 
Warum?
...wie ein Beenden über die GUI,...

Das funktioniert eben leider nicht, wenn ich das Docker-Image über die GUI beendet wird das Programm darin (Picapport) nicht sauber beendet.
Starte ich den Container erneut, gibt es jede Menge Datenbankfehler.

Ich muss hier nochmal mit dem Ersteller des Docker-Images Kontakt aufnehmen.

Gruß Tom
 
… Wenn ich jetzt z.B. bei einem Update der DS einen Neustart machen muss, muss ich vorher dran denken den Container sauber zu beenden, …
Und ich dachte, du machst das über die GUI von Docker. Wie beendest du ihn denn da sauber? Über eine GUI vom Container?
 
Ich hatte immer das Problem dass nach einem neustart der DS der Picapport-Container nicht mehr sauber lief. Ich dachte das kommt daher dass dieser nicht sauber beendet wurde.
Das es auch nicht funktioniert wenn ich den Container in der Docker GUI beende war mir da noch nicht bewußt.
Ich habe im Moment noch keine Lösung wie die Software Picapport im Container sauber beendet bekomme.

Tom
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat