Jump to content
LAST CALL on the Unraid Summer Sale! 😎 ⌛ ×

Benötige Tipps zu Python Docker Container und dessen Nutzung


hawihoney

Recommended Posts

Das kürzliche Fiasko mit dem Plugin "Unassigned Devices Preclear" (Falsche Abhängigkeiten hebelten alle User Skripte aus und erforderte letztlich einen Neustart) hat mir wieder vor Augen geführt, wie gefährlich diese ganzen Plugins und Tools sein können. Deshalb möchte ich das weitestgehend ablösen und isolieren. Das Plugin "Dev Tools" konnte ich zwischenzeitlich ablösen. Bleibt bei mir noch das Plugin "Nerd Tools" übrig von dem ich sehr intensiv die folgenden Tools nutze:

 

python3

python-pip

python-setuptools

screen

rar

unrar

 

Als nächstes wollte ich mich nun also um Python kümmern.

 

Hier laufen dutzende Python Skripte die ich entweder manuell auf der Konsole aufrufe oder via User Script Plugin. Meine Idee ist, dass ich Python komplett als Docker Container installiere (gibt es wohl nur im Docker Hub). Und statt meine Skripte wie folgt aufzurufen ...

 

python3 /mnt/disk1/Projekte/********/Plex/SOURCE/SetEpisodeTitle.py --title "westworld"

 

... müsste ich das dann doch wie folgt aufrufen, oder? Voraussetzung wäre dann allerdings, dass das Container Mapping /mnt --> /mnt existiert.

 

docker exec <python_container> python3 /mnt/disk1/Projekte/********/Plex/SOURCE/SetEpisodeTitle.py --title "westworld"

 

1.) Ist meine Vermutung richtig?

 

2.) Und wenn das so ginge, gäbe es die Möglichkeit "docker exec <python_container> python3" auf einen Alias/Export (heißt das so?) "python3" zu setzen?

 

3.) Welchen Python Container würdet Ihr empfehlen?

 

4.) Nachtrag: In manchen Python Skripte greife ich wiederum auf andere Docker Container (wie MakeMKV, MKVToolNix) zu. Das wird dann wahrscheinlich nicht gehen, oder?

 

Vielen Dank.

 

Edited by hawihoney
Link to comment
15 minutes ago, alturismo said:

anstelle Nerd Tools zu nutzen, boot extra, pack da deine gewollten Pakete rein ?

 

Klar, das kenne ich. Das Problem ist aber, dass irgendein Paket andere Pakete bzw. das OS himmeln kann. Oder vice versa, durch einen Update des OS werden Pakete ausgehebelt.

 

Ich würde gerne unter allen Umständen vermeiden, dass mir so etwas wie Anfang dieser Woche noch einmal passiert. Ganz eliminieren kann ich es nicht, denn Unassigned Devices, etc sind nahezu unverzichtbar und mit sehr vielen eigenen Paketen extrem nah am System. Aber alles was geht, will ich jetzt vom OS isolieren. Und da kam mir Docker in den Sinn.

 

Ich hatte gerade einen notwendigen Disk-Rebuild (24 Stunden) gestartet, da habe ich bemerkt, dass ein gerade zuvor durchgeführter UD-Preclear Update (11.07.) alle meine User Skripte behinderte. Die liefen nicht mehr. Und on top war dann noch gleich ein Fehler in UD selbst am 04.07. reingerutscht, der dann auch noch einige Skripte, die zumindest auf der Konsole liefen, ebenfalls behinderte. Gut ich hatte die Fehler in beiden Plugins sofort gemeldet, aber das dauert halt seine Zeit. Für knapp 24 Stunden konnte ich nix machen, nix lief. Nur ein Reboot nach 24 Stunden half.

 

Mittlerweile frage ich mich, warum man das Plugin System nicht mit einer Rollback Funktion versieht ... und solange es das nicht gibt würde ich gerne das eigentliche OS mehr abschotten.

 

Link to comment
2 hours ago, hawihoney said:

und solange es das nicht gibt würde ich gerne das eigentliche OS mehr abschotten.

naja, dann würde ich mir LXC anschauen, hat @ich777 ja eingeführt, damit hast du ein recht vollwertiges OS, lässt dann alles darin laufen was so ansteht ... wäre das eine Option ? musst nur deine Volumes mounten usw ... 

 

das UAD Thema habe ich mitbekommen, nur das würde ich jetzt nicht wirklich überbewerten ... auch wenn ich es verstehe ;) daher habe ich auch Nerd Tools ex da dies anfangs mit 6.9 meine ich auch nicht mehr lief ... und da es ja sinnfrei war weil es ja nichts anderes macht ...

 

in deinem Fall würde ich mir eine Umgebung schaffen wo ich dann halt intern auch alles ausführe, Bsp LXC, dann halt alles auch darin ausführen, sprich die Apps die du benötigst dann auch da installieren und auf die separaten Docker zu verzichten, von einem Docker im anderen was ausführen ... wird nur über Umwege gehen, da machst du mehr Baustellen auf wie es zu belassen ... Ansatz wäre da, Befehl als Textdatei ablassen, ein script nimmt das auf und führt dann wiederum docker exec ... aus, aber wie gesagt, das wäre jetzt nicht mein Weg ;) ich arbeite ja auch mit scripts zum reencoden, ebooks umwandeln, Aufnahmen remuxen, moven, ... da ist dann immer einiges zu machen, nutze aber auch kein python dafür sondern simpel bash scripting.

  • Like 1
Link to comment
On 7/13/2022 at 10:28 AM, hawihoney said:

... müsste ich das dann doch wie folgt aufrufen, oder? Voraussetzung wäre dann allerdings, dass das Container Mapping /mnt --> /mnt existiert.

 

docker exec <python_container> python3 /mnt/disk1/Projekte/********/Plex/SOURCE/SetEpisodeTitle.py --title "westworld"

 

Ja, aber dann muss der Pfad /mnt/disk1/Projekte/.../skriptname.py und natürlich auch alle Pfade auf die das Skript zugreifen können soll, auch 1:1 in dem Docker verfügbar gemacht werden, weil dein Befehl "python3 ..." wird dann ja innerhalb des Containers ausgeführt. Aber ich denke das ist dir klar.

 

Hier ein Beispiel:

 

root@thoth:~# ls -lah /mnt/user/Marc/Scripts/python
total 4.0K
drwxrwxrwx 1 marc users 27 Jul 14 16:50 ./
drwxrwxrwx 1 marc users 20 Jul 14 16:50 ../
-rw-rw-rw- 1 marc users 40 Jul 14 16:56 helloworld.py
root@thoth:~# 
root@thoth:~# docker run -it --rm --name helloworld.py -v /mnt/user/Marc/Scripts/python:/mnt/user/Marc/Scripts/python python:3 python /mnt/user/Marc/Scripts/python/helloworld.py
Unable to find image 'python:3' locally
3: Pulling from library/python
d836772a1c1f: Pull complete 
66a9e63c657a: Pull complete 
d1989b6e74cf: Pull complete 
c28818711e1e: Pull complete 
5084fa7ebd74: Pull complete 
7f162c881e4f: Pull complete 
e3f48ccb2876: Pull complete 
315a1520c10e: Pull complete 
eba0bda87095: Pull complete 
Digest: sha256:ce21f64c4c3ae5743ddd5f4d4d9ca5614fddcc4f8c6e32ff2a7ff9a2e8744e8d
Status: Downloaded newer image for python:3
Hello World!

 

Nicht wundern, der Python-Container ist nach der Ausführung nicht in der Basis-Ansicht auf der Docker-Übersicht zu sehen. Erst wenn du auf Advanced umschaltest, siehst du einen "orphan" Container (er wurde also automatisch "gelöscht"):

 

image.png.31578812bb4e2d3623811c3fee402736.png

 

Das ist bewusst so gemacht, weil es keinen Sinn macht den Container ständig laufen zu lassen. Solange der Orphan da ist, geht die Ausführung auch sehr schnell, weil er dann den Container nicht komplett neu herunterladen muss:
 

root@thoth:~# docker run -it --rm --name helloworld.py -v /mnt/user/Marc/Scripts/python:/mnt/user/Marc/Scripts/python python:3 python /mnt/user/Marc/Scripts/python/helloworld.py
Hello World!

 

Beachte außerdem, dass du für jedes Skript einen eigenen "--name scriptname.py" angibst, weil der für jedes Skript einen eigenen Container starten muss, ansonsten kommt es zu einer Fehlermeldung, wenn parallel ein zweites Skript gestartet wird:

 

image.thumb.png.97b8ff69761f8ade91dad721bf0a0b50.png

 

So wäre es also richtig:

 

image.thumb.png.0335fda743b5aa1b998212d6626da07e.png

 

 

Eventuell kann es sein, dass du die zusätzlichen gewünschten Kommandos (unrar etc) in deinem Skript auf Existenz prüfen und dann nachinstallieren musst. Auch das sollte dann nur beim ersten Mal installiert werden und danach ständig verfügbar sein, solange der Orphan existiert.

Link to comment
37 minutes ago, mgutt said:

Aber ich denke das ist dir klar.

 

Genau. Das meinte ich mit "Container Mapping /mnt --> /mnt".

 

In Deinen Ausführungen geht es um das Ausführen eines Skripts mit dem Starten eines neuen oder "geparkten" Containers. Ich dachte in meiner naiven Denke an einen Python Container der wie alle anderen Container installiert ist (z.B. MKVToolNix) und gestartet bleibt. Und dessen Inneres ich dann nutzen kann - quasi als isoliertes Installationsverzeichnis. Und mit "docker exec" nutze ich das dann. So wie ich mir die MKVToolNix, MakeMKV und Plex Container zunutze mache. Das ist aus einer "include" meiner Python Skripte. Genau das würde ich auch gerne mit Python selbst erreichen:

 

#### Container names (required) ###################
plex_container = "plex"
makemkv_container = "MakeMKV"
mkvtoolnix_container = "MKVToolNix"

#### Container tools (do not edit) #####
plex_media_scanner = f"docker exec {plex_container} /usr/lib/plexmediaserver/Plex\\ Media\\ Scanner"
makemkvcon = f"docker exec {makemkv_container} env HOME=/config /opt/makemkv/bin/makemkvcon"
mkvinfo = f"docker exec {mkvtoolnix_container} /usr/bin/mkvinfo"
mkvpropedit = f"docker exec {mkvtoolnix_container} /usr/bin/mkvpropedit"
...
command = f'{mkvpropedit} "{video_media_part_file}"{info}'

 

 

Edited by hawihoney
Link to comment
58 minutes ago, hawihoney said:

Ich dachte in meiner naiven Denke an einen Python Container der wie alle anderen Container installiert ist (z.B. MKVToolNix) und gestartet bleibt

Das kannst du probieren, aber vom Prinzip verschwendet man damit nur Ressourcen, weil der läuft ja für nichts.

Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...