Docker unter LibreELEC: Container aus Kodi starten?

  • Hallo,

    ich nutze unter LibreELEC (Nexus) 11.0.1 - Docker/Portainer (linuxserver.io).

    Kennt jemand eine Möglichkeit, Docker-Container aus Kodi heraus zu starten? Also in der GUI von Kodi den Container auswählen und starten?

    Gibt es da vielleicht ein Add-On? Irgend eine andere Idee?

    Per SSH und über die Portainer-Webseite ist mir bekannt. Raspberry Pi läuft allerdings in einem separaten Netz und ich möchte nur kurz per Fernbedienung den einen oder anderen Container starten, wenn ich diesen benötige.

    Hat da jemand eine Idee? Vielen Dank!

  • Also....Wenn du einen Container starten möchtest, kommt es auch ein wenig darauf an welchen Container und was der machen soll und wie du ihn dafür starten musst.

    Aber erstmal ist mir kein Weg bekannt wie man einen Container über die Kodi GUI starten kann.

    Dafür ein Addon zu schreiben, welches entsprechende Befehle auf OS Ebene absetzt oder ein Script ausführt, ist jetzt nicht soooo schwer. Gut...Wenn man es noch nie gemacht hat, dann natürlich schon.

    Weiter muss man aber auch feststellen ob der Container vielleicht schon läuft und wenn der Container schon läuft, dann sollte ein weiterer Start verhindert werden. Man muss also ein wenig Logik einbauen.

    Mich würde aber der genaue Bedarfsfall interessieren:

    Um welchen Container geht es?

    Warum wird der Container nicht einfach gestartet wenn du den Kodi Client bootest?

    Falls das "Start on boot" nicht funktioniert...Warum funktioniert das nicht? Hast du das mal analysiert?

    Einen Container, der crasht, kann man auch mit

    [tt]restart: "on-failure[\tt]

    automatisch wieder starten lassen (wobei ich dann eher klären würde warum er crasht)

    Wertschätzung kostet nichts, aber sie ist von unschätzbarem Wert.

  • Um welchen Container geht es?

    Das wäre jetzt aktuell z.B. folgender Container: https://hub.docker.com/r/jaymoulin/jdownloader

    Warum wird der Container nicht einfach gestartet wenn du den Kodi Client bootest?

    Wird er ja aktuell. Das möchte ich ja verhindern, weil ich den ein oder anderen Container eher selten benötige und nicht die ganze Zeit immer mit gestartet werden soll. Wie oben beschrieben ist der Raspberry Pi in einem separaten VLAN. Jetzt will ich aber nicht jedes Mal erst meinen Rechner umswitchen (anmelden, Command ausführen, ...) um über SSH oder Portainer den Container zu starten. in der Kodi GUI das eben per Fernbedienung zu starten, stell ich mir da einfacher vor.

    Falls das "Start on boot" nicht funktioniert...Warum funktioniert das nicht? Hast du das mal analysiert?

    Einen Container, der crasht, kann man auch mit

    [tt]restart: "on-failure[\tt]

    automatisch wieder starten lassen (wobei ich dann eher klären würde warum er crasht)

    Container-Start funktioniert alles so wie es soll. Die Restart Policies sind mir auch bekannt. Bei den eher selten benötigten Containern würde ich dann den automatischen Start deaktivieren.

    Danke.

  • Container-Start funktioniert alles so wie es soll. Die Restart Policies sind mir auch bekannt. Bei den eher selten benötigten Containern würde ich dann den automatischen Start deaktivieren.

    Perfekt. Dann brauchen wir da nicht weiter machen ;) . Ich fange bei den Antworten hier oftmals bei "0" an, da ich ja nicht wissen kann, wo der ein oder andere steht. Nicht böse gemeint. ;)

    Weiter würde ich auch nun denken, dass du weißt, wie du den Container über die Kommandozeile startest. Also sowas wie docker run -d .... ist dir dann mit Sicherheit auch bekannt.

    in der Kodi GUI das eben per Fernbedienung zu starten, stell ich mir da einfacher vor.

    Da gibt es jetzt 2 Möglichkeiten.

    Einmal den Weg über ein Addon und der andere Weg über eine freie Taste deiner Fernbedienung. Im Endeffekt benötigt beides irgendeine Art von Script. Für das Add-on braucht es Python, für die "freie Taste auf deiner Fernbedienung z. B. ein Shell Script.

    Ich fange mal mit dem Weg über die Taste deiner Fernbedienung an:

    Hier kommt es darauf an, wie deine Fernbedienung vom System (dem Pi) erkannt wird. Manche Fernbedienungen werden als solche erkannt (remote) andere wiederum als Tastatur (keyboard). Wie die Fernbedienung erkannt wird, siehst du wenn du dir das Kodi [definition='1','0']log[/definition] anschaust und dann im laufenden Betrieb und während du dir das Log anschaust, Tasten auf deiner FB drückst.

    Ich würde wie folgt vorgehen:

    • Kodi starten
    • debug [definition='1','0']log[/definition] aktivieren
    • per ssh einloggen
    • folgenden Befehl ausführen: tail -f /storage/.kodi/temp/kodi.[definition='1','0']log[/definition]
    • die Taste drücken, die du dafür verwenden möchtest
    • darauf achten, was im Log angezeigt wird. Wichtig ist dabei der Teil der Zeile wo "Action is: ...." steht. Diese "Action" brauchst du dann später

    Weiter siehst du dann auch im Log ob ein "Keyboard" oder ein "Remote"-Keypress stattgefunden hat.

    Wenn du das alles weißt, dann kannst du dir eine [definition='3','0']keymap[/definition].xml-Datei im Ornder /storage/.kodi/userdata/keymaps anlegen. Diese könnte ungefähr so aussehen.

    Code
    <[definition='3','0']keymap[/definition]>
      <global>
        <keyboard>
          <'action'>System.Exec(/pfad/zu/einem/script.sh)</'action'>
        </keyboard>
      </global>
    </[definition='3','0']keymap[/definition]>

    Falls deine FB als Remote erkannt wird, dann tauscht du einfach keyboard gegen remote aus.

    System.Exec(exec) ist eine sogenannte "Built in function" in Kodi: https://kodi.wiki/view/List_of_b…System_built-in's

    und damit kann man Shell-Scripte ausführen. Den Trigger zum Ausführen des Scripts hast du mit der Keymap.xml festgelegt. Jedes Mal, wenn du diese Taste drückst, wird das Script ausgeführt.

    Jetzt geht es an die Logik des Scripts und was du machen möchtest. Man könnte auch den Tastendruck als An- und Ausschaltknopf für den Docker erklären. Das alles entscheidest du im Script.

    Mal so ein paar Optionen, was das Script können könnte (einige Punkte kannst du vielleicht streichen, weil sie nicht in deinen Bedarfsfall passen):

    Option 1:

    • prüfen ob der Container läuft: potentiell sowas: docker ps | grep -i <name_des_containers>
      • läuft er nicht
        • prüfe ob er existiert: potentiell mit docker ps -a | grep -i <name_des_containers>
          • wenn er existiert, aber gestoppt ist, starte ihn mit docker start <name_des_containers>
          • wenn er nicht existiert, dann erstelle ihn mit docker run -d --name "<name_des_containers>" <sonstige Parameter>
      • läuft er, stoppe ihn mit docker stop <name_des_containers>

    Option 2:

    • prüfen ob der Container läuft (siehe oben)
      • läuft er nicht
        • prüfe ob er existiert (siehe oben)
          • wenn er existiert, aber gestoppt ist, starte ihn mit docker start <name_des_containers>
          • wenn er nicht existiert, dann erstelle ihn mit docker run -d --name "<name_des_containers>" <sonstige Parameter>
      • läuft er, nichts unternehmen und mit exit 0 das Script beenden.

    Voraussetzung dafür ist, dass der Container mit einem selbst definiertem Namen gestartet wird. Also sowas wie docker run -d --name "myjdownloader" ..... Das macht die Prüfung des Containers einfacher, wenn der Name des Containers nicht immer irgendwas zufälliges ist. Weiter solltest du ein Version-Pinning am Container vornehmen. Du solltest also darauf achten, dass du nicht "latest" im Image-Tag stehen hast. Grund ist....wenn du den Container neu startest und "latest" drin steht, könnte es gut sein (je nach pull-policy) dass das neueste Image gezogen wird. Wenn das nicht läuft, weißt du nicht, welche Version du vorher installiert hattest. Denn das war auch nur "latest" ;) . "latest" ist also in jedem Fall immer eine schlechte Idee für den Image-Tag.

    Dann musst du das Script nur noch an eine entsprechende Stelle ablegen und in deiner [definition='3','0']keymap[/definition].xml den vollen Pfad zum Script angeben.

    Das wärs dann auch schon. Das Script musst du natürlich noch schreiben und die ganze Logik da rein packen. Ein paar "if" und "else" sollten das Problem schon lösen. Ein paar Strings musst du halt auch auswerten, die du von dem "grep" bekommst. Da kann man auch noch elegante Dinge mit "awk" machen um einzelne Felder zu bekommen, wenn man möchte.

    Mir ist klar, dass das schon ein wenig komplex ist....das Add-on wird aber nicht weniger komplex, da du dich da auf Python-Ebene bewegst, du aber auf Betriebssystem-Ebene Dinge tun möchtest. Bestimmt gibt es da nette Libraries, die man nutzen kann. Da müsste ich aber auch erst Googlen. Das Script ist, wenn man kann, schnell geschrieben. Das ist kein großes Hexenwerk. Zumindest nicht für mich ;)

    Wenn du da Unterstützung brauchst, lass es mich wissen. ich helfe gern. Wenn du ein Add-on brauchst, kann ich dir auch eines Stricken. Das kann aber PvD bestimmt wesentlich besser und schneller als ich es könnte. ;)

    Sag wie du es haben möchtest ;)

    Wertschätzung kostet nichts, aber sie ist von unschätzbarem Wert.

  • Vielen Dank für deine Ausführungen!

    Ich hatte mich jetzt noch mal auf die Recherche begeben und folgendes gefunden: https://github.com/wastis/ShellScriptLauncher (zip unter https://github.com/wastis/LinuxAd…script.launcher ). Das wäre genau, was benötigt würde.

    Ich habe es mal in einer Testumgebung installiert. Ich bin jetzt allerdings noch nicht ganz durchgestiegen, was am Command falsch ist oder noch benötigt wird.

    Ich habe es naiv erstmal mit

    Docker stop:notify,exitcode 0:docker stop portainer

    Docker start:notify,exitcode 0:docker start portainer

    versucht, was aber zu einem Fehler führt. Per SSH funktioniert docker start(stop) portainer problemlos.

    Es muss wahrscheinlich der Pfad zu docker korrekt/anders angegeben werden, vermute ich mal...

    Code
    debug <general>: exec: execute: docker stop portainer
    error <general>: exec: exc_err: FileNotFoundError: _execute_child@subprocess.py(1901), __init__@subprocess.py(1024), run_addon@runaddon.py(153), run_addon@runaddon.py(156), <module>@addon.py(23):(2,No such file or directory)
  • Du brauchst kein Addon für Dinge, die auch mit Boardmitteln getan werden können.

    Wenn du Probleme mit dem Addon hast, dann wende dich bitte an den Entwickler.

    Ich kann dir nur Support geben für das, was ich dir vorgeschlagen habe.

    Python hat Probleme auf der Shell subprozesse zu starten. Das ist nicht supported. Ich wollte schon mal so ein Addon schreiben und bin an der gleichen Stelle gescheitert. Auf Nachfrage im Team wurde mir gesagt, dass das nicht supported ist.

    Wertschätzung kostet nichts, aber sie ist von unschätzbarem Wert.

  • Ich habe auf meiner Fernbedienung jetzt nicht wirklich genügend freie Tasten auf Grund von HDMI CEC die dann keine Aktion am Fernseher selber auslösen würden.

    Falls noch mehr Docker Container folgen, finde ich diese Lösung auch irgendwie nicht praktisch.

    Hatte ich ein anderes Boardmittel jetzt übersehen?

    Der funktionierende Aufruf lautet übrigens

    /storage/.kodi/addons/service.system.docker/bin/docker start CONTAINERNAME


    Oben genanntes Addon funktioniert damit jetzt problemlos:

    Da könnte man jetzt noch ein Script wie von dir oben beschrieben drumherum basteln, ist jetzt für meine Zwecke allerdings aktuell nicht nötig, denn mehr habe ich in der Vergangenheit ja mit Portainer auch nicht gemacht außer Container gestartet oder gestoppt.

    Vielen Dank!

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!