Docker neu starten ohne "Fehlermeldung"

Ghost108

Benutzer
Mitglied seit
27. Jun 2015
Beiträge
1.268
Punkte für Reaktionen
74
Punkte
68
Guten Morgen!

ich würde gerne meinen Docker Container "homebridge" täglich neu starten.
Dafür habe im Aufgabenplaner einen täglichen Task erstellt, mit dem Befehl:

docker restart homebridge

Das klappt auch.
Allerdings erhalte ich bei jedem Neustart von der Syno dann folgende "Fehlermeldung"

Bildschirm­foto 2023-02-06 um 07.34.50.png

Kann ich "homebridge" auch ordnungsgemäß neu starten, damit diese Meldung nicht zustande kommt?
 

Fusion

Benutzer
Sehr erfahren
Mitglied seit
06. Apr 2013
Beiträge
14.172
Punkte für Reaktionen
922
Punkte
424
Bekomme ich auch für Container die ich mit Docker-compose an der GUI vorbei betreibe.

Da mir gerade nichts besseres einfällt...

Ist der Container mit "restart always" (bei Fehlern) im Betrieb?
Vielleicht hilft es dann wenn du anstatt 'restart' auf einem Zweizeiler mit 'stop' und 'start' wechselst.
 

Fusion

Benutzer
Sehr erfahren
Mitglied seit
06. Apr 2013
Beiträge
14.172
Punkte für Reaktionen
922
Punkte
424
Oder mal docker container restart homebridge?
 

Ghost108

Benutzer
Mitglied seit
27. Jun 2015
Beiträge
1.268
Punkte für Reaktionen
74
Punkte
68
docker container restart homebridge
-> selbes Ergebnis

Interessant wäre zu wissen, ob es eine Möglichkeit gibt, via Shell einen Restart der Homebridge auszulösen,
sowie es über das Homebridge UI funktioniert. Hier wird nur einer Restart der Homebridge Instanz ausgelöst ohne den docker neu zu starten
 

Ghost108

Benutzer
Mitglied seit
27. Jun 2015
Beiträge
1.268
Punkte für Reaktionen
74
Punkte
68
docker exec -it homebridge hb-service restart
ℹ Restarting Homebridge Service
✖ ERROR: This command is not available.
 

EDvonSchleck

Gesperrt
Mitglied seit
06. Mrz 2018
Beiträge
4.703
Punkte für Reaktionen
1.120
Punkte
214
Dazu hat mit @haydibe vor einiger Zeit etwas geschrieben: (ich hoffe es ist in Ordnung, wenn ich das hier veröffentliche)

Meine Hypothese: die betroffenen Container haben einen Exit-Status-Code > 0, wenn WT den Container beendet.
Führ doch mal `docker stop` für einen der betroffenen Container durch und schau dir mit `docker ps -a` an welcher Exit-Status-Code (`Exited (x)`) in der Spalte STATUS steht. Ich gehe davon aus, dass bei allen Containern die zu der Fehlermeldung geführt haben, nicht 'Exited (0)` (=kein Fehler) steht.
Üblicherweise findet man im Container-Context die Codes 137 + 143. Hier findet man eine Erläuterung dazu: https://komodor.com/learn/sigterm-signal-15-exit-code-143-linux-graceful-termination/
Sobald ein `docker stop` ausgeführt wird, wird SIGTERM an pid1 im Container geschickt. Wenn der Prozess innerhalb einer Grace-Period von 10 Sekunden nicht beendet wird, dann wird der Container hart mit SIGKILL beendet.
Wenn SIGTERM nicht zum Beenden des Hauptprozesses führt, kann es an falschem Image-Design liegen: ENTRYPOINT/CMD im Dockerfile nutzen nicht die Array-Syntax und/oder das Entrypoint-Skript startet die Hauptanwendung nicht mit `exec`, um PID1 an diesen Prozess zu übergeben (andernfalls erreicht das SIGTERM den Hauptprozess nie!).
Es kann aber auch sein, dass das Image Design korrekt ist, aber die Hauptanwendung einfach keinen SIGTERM-Handler implementiert hat, der das Signal sauber verarbeiten würde um den Prozess geordnet zu beenden. So ist es zum Beispiel mit meinem Language-Tool Image gewesen, weswegen ich seit 5.9-8 unter Verwendung von `tini` den Exist-Status-Code schlucke.

Ich hätte vielleicht besser schreiben sollen: "Wenn es nicht richtig läuft, findet man überlicherweise..."

Der Standard sollte natürlich 0 sein.

Bei Watchtower gibt es die Überlegung den Neustart über die API zu machen, damit das System dieses besser erkennt.
 

Ghost108

Benutzer
Mitglied seit
27. Jun 2015
Beiträge
1.268
Punkte für Reaktionen
74
Punkte
68
Verstehe!
Okay, dann programmiere ich eine Lösung via Homebridge UI API
 

Ghost108

Benutzer
Mitglied seit
27. Jun 2015
Beiträge
1.268
Punkte für Reaktionen
74
Punkte
68
Update: Mit der API klappt es tadellos ohne "Fehlermeldung"
Danke für den Hinweis!! :)
 

DrDeath

Benutzer
Mitglied seit
31. Aug 2018
Beiträge
203
Punkte für Reaktionen
90
Punkte
34
wahrscheinlich über zwei cURL Aufrufe an die API:
Code:
curl -X 'POST' \
  'http://<IP>:<PORT>/api/auth/login' \
  -H 'accept: */*' \
  -H 'Content-Type: application/json' \
  -d '{
  "username": "dein-hb-username",
  "password": "dein-hb-password",
  "otp": "string"
}'

Response Body: z.b.

Code:
{
  "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InN0ZW1hdGgiLCJuYW1lIjoic3RlbWF0aCIsImFkbWluIjp0cnVlLCJpbnN0YW5jZUlkIjoiYTE1MzVjYWZmNDQ2MGQxODA0M2I5NWExOGU5N2RkY2Q4NGFlYjU5Y2VkNTY3NzNjMDUwY2QzNTdiOWRiNDgwNCIsImlhdCI6MTY3NTcxMzA5MCwiZXhwIjoxNjc1NzQxODkwfQ.dvC4ByR-6yx0uZixpDnJGpTg7Cz3xcuE2nn_Dv3nD-o",
  "token_type": "Bearer",
  "expires_in": 28800
}

Vom Response Body den "access_token" auslesen und an den nächsten cURL einbauen:

Code:
curl -X 'PUT' \
  'http://<IP>:<PORT>/api/server/restart' \
  -H 'accept: */*' \
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InN0ZW1hdGgiLCJuYW1lIjoic3RlbWF0aCIsImFkbWluIjp0cnVlLCJpbnN0YW5jZUlkIjoiYTE1MzVjYWZmNDQ2MGQxODA0M2I5NWExOGU5N2RkY2Q4NGFlYjU5Y2VkNTY3NzNjMDUwY2QzNTdiOWRiNDgwNCIsImlhdCI6MTY3NTcxMzA5MCwiZXhwIjoxNjc1NzQxODkwfQ.dvC4ByR-6yx0uZixpDnJGpTg7Cz3xcuE2nn_Dv3nD-o'

Response Body:
Code:
{
  "ok": true,
  "command": "SIGTERM",
  "restartingUI": false
}
 
  • Like
Reaktionen: EDvonSchleck


 

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