Ubuntu Image über Dockerfile, wie persistente Daten definieren

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.155
Punkte für Reaktionen
1.116
Punkte
314
Hi!

Ich spiele zur Zeit ein wenig mit Docker rum und habe über Portainer bereits erfolgreich den Nginx Proxy Manager als auch einen einfachen Nginx Webserver über zwei entsprechende Stacks eingerichtet. Soweit habe ich dieses Thema zunächst verstanden.

Nun kam in mir die Idee auf, einen einfachen Ubuntu Container zu erstellen, auf den ich per SSH zugreifen kann und worin bereits die Programme nano mc und git laufen. Nach einer kleinen Recherche bin ich dann auf Dockerfile und Docker Images gestoßen und habe es nach ein wenig rumgefrickel tatsächlich geschafft, mir solch einen Ubuntu Container zu bauen. Ich kann mich per SSH aufschalten und die oben genannten Programme laufen auch.

Über die eingangs erwähnten Stacks konnte ich ja einen sogenannten „End-Point“ angeben, also einen persistenten Speicherort innerhalb des Ordners volume1/docker/ angeben, welche einen flüchtigen Container überleben.

Wie schaffe ich es jetzt, z.B. den Ordner /home/tommes aus dem Ubuntu Container, ebenfalls auf einen persistenten Speicherort innerhalb des Ordners volume1/docker/ zu bekommen? Muss ich dafür irgendeinen Stack anlegen, oder läuft das über das Dockerfile?

Kann mir hier vielleicht jemand einen Tipp geben, ob und vor allem wie man so was umgesetzt bekommt. Am besten wäre natürlich der passende Eintrag im Stack bzw. im Dockerfile.

Tommes
 

alexhell

Benutzer
Sehr erfahren
Mitglied seit
13. Mai 2021
Beiträge
2.612
Punkte für Reaktionen
759
Punkte
154
Du kannst eigentlich deine Ordner/Volumes im Stack/Run Befehl mitgeben. Also docker run -v hostPaht:containerPath ..... Es ist nicht nötig diese in der Dockerfile zu definieren.
 

haydibe

Benutzer
Sehr erfahren
Mitglied seit
12. Apr 2016
Beiträge
1.481
Punkte für Reaktionen
364
Punkte
103
Es wird mittlerweile als Antipattern angesehen VOLUME Anweisungen im Dockerfile zu definieren. Für gewöhnlich markiert man mit der VOLUME Anweisung die Container-Verzeichnisse, in denen später die persistenten Daten liegen werden - mountet tut es natürlich nichts.. Blöderweise erwartet Docker dann, dass beim Container ein Volume gegen dieses Container Verzeichnis gemapped wird und wenn man das nicht tut, dann erzeugt es einfach ein "Anonymous Volumes" dafür (werden bei docker volume ls mit zufälligen Aphanumerischen Namen angezeigt)..
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.155
Punkte für Reaktionen
1.116
Punkte
314
Hm... also irgendwie klappt das nicht. Ich starte den Container z.B. so...
docker run -v /volume1/docker/ubuntu/home:/home -d -p 2222:22 ubuntu-ssh
Der Container startet auch und ich kann mich per SSH verbinden, nur lande ich dann nicht mehr im /home Ordner von tommes, sondern im Wurzelverzeichnis des Systems. Wenn ich dann z.B. versuche, den mc zu starten, erhalte ich...
tommes@b642670d3a73:~$ mc
Failed to run:
Cannot create /home/tommes/.config/mc directory

Starte ich den Container ohne die Volume Angaben, dann lande ich nach der SSH Anmeldung sofort im /home Ordner von tommes und mc funktioniert ebenfalls. Also irgendwas läuft da noch falsch.
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.155
Punkte für Reaktionen
1.116
Punkte
314
Ich habe die Rechte auf dem host - sprich der DS - nochmal überprüft und auch angepasst, weil der Benutzer tommes auf /volume1/docker/ubuntu zunächst keine Schreib-/Leserechte hatte. Dies ist nun der Fall.
0 drwxr-xr-x+ 1 tommes users 8 Apr 10 20:13 ubuntu
Ändert aber nichts am Ergebnis. Falls das jemand mal selbst testen mag. Die Anleitung für den Ubuntu Container habe ich von hier...

Edit:
Im Ubuntu Container lauten die Rechte jedoch so...
tommes@01da4453a042:/home$ ls -lachs
total 0
0 drwxr-xr-x 1 root root 12 Apr 10 17:48 .
0 drwxr-xr-x 1 root root 174 Apr 10 18:22 ..
0 drwxr-x--- 1 tommes root 72 Apr 10 18:22 tommes
 

alexhell

Benutzer
Sehr erfahren
Mitglied seit
13. Mai 2021
Beiträge
2.612
Punkte für Reaktionen
759
Punkte
154
Setze doch mal auf der DS mit chown die selben IDs wie du sie im Container hast. Dein User hat ja die ID 1000 GID 0.
 

alexhell

Benutzer
Sehr erfahren
Mitglied seit
13. Mai 2021
Beiträge
2.612
Punkte für Reaktionen
759
Punkte
154
Also ich habe das gerade mal ausprobiert und es funktioniert.
1712774284998.png
1712774305592.png
Ich habe es auf meinem Dockerhost probiert und es klappt auf anhieb, wenn die IDs richtig gesetzt sind. Siehe
1712774364255.png
 

haydibe

Benutzer
Sehr erfahren
Mitglied seit
12. Apr 2016
Beiträge
1.481
Punkte für Reaktionen
364
Punkte
103
Wenn bei `id` für alex UID=1000 und GID=1000 zurückkommt, dann sollte das doch alles passen.

Update: ich hab übersehen, dass die letzte Antwort nur ein Test von @alexhell war.

Solange die UID:GID vom Container-User mit dem Verzeichnisbesitzer übereinstimmt, sollte es gehen..
 

alexhell

Benutzer
Sehr erfahren
Mitglied seit
13. Mai 2021
Beiträge
2.612
Punkte für Reaktionen
759
Punkte
154
Im Container kam als GID die 0 zurück. Aber UID war die 1000. Aber solange er schreiben kann müsste es ja passen.
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.155
Punkte für Reaktionen
1.116
Punkte
314
Okay Leute. Ich brech hier jetzt mal ab, da bei mir grad nur noch Mist rauskommt. Ein chown hat noch nicht den nötigen Erfolg gebracht und ich finde grad den Fehler nicht. Sobald ich einen Container mit docker run -v ... starte, funktionert das nicht. Ohne -v klappt das wunderbar. Ich setze mich morgen Abend nochmal in Ruhe dran und berichte. Ich weiß jetzt ja zumindest, worauf ich achten muss und wenn es bei euch läuft, sollte ich es ja auch irgendwie hinbekommen.

Vielen dank euch beiden bis hierhin. Ihr werdet morgen sicherlich wieder von mir hören... hoffentlich mit einer Erfolgsmeldung.

Tommes
 

plang.pl

Benutzer
Contributor
Sehr erfahren
Maintainer
Mitglied seit
28. Okt 2020
Beiträge
14.195
Punkte für Reaktionen
4.931
Punkte
519
Es kommt auch auf den Container an. Wenn ich ein unbound mit gemountetem Config-Verzeichnis starte und da liegen keine leeren Textdateien im Mount, dann crasht der Container.
 

alexhell

Benutzer
Sehr erfahren
Mitglied seit
13. Mai 2021
Beiträge
2.612
Punkte für Reaktionen
759
Punkte
154
Das liegt aber daran, dass unbound wahrscheinlich einfach die Dateien erwartet.
Ich habe im Host Order den Unterordner per Hand noch erstellt. Sonst ist /home ja leer und der Home Ordner somit nicht vorhanden....
 

plang.pl

Benutzer
Contributor
Sehr erfahren
Maintainer
Mitglied seit
28. Okt 2020
Beiträge
14.195
Punkte für Reaktionen
4.931
Punkte
519
So ist es. Ich will sagen: Kommt auf den Container an.
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.155
Punkte für Reaktionen
1.116
Punkte
314
Neuer Tag, neues Glück!

Hab mich grad nochmal dran gesetzt und es hat auf Anhieb funktioniert, wobei mir zwei Dinge aufgefallen sind, die mir nicht bewusst waren.

Der Benutzer "tommes" verfügt über keine Administrationsrechte und hat daher keinen Zugriff auf den /docker Ordner. Ich hatte diesem Benutzer zwar Schreib-/Leserechte gegeben, habe aber heute erst festgestellt, das diese Rechte nur für die "Vorschau" gelten. (What the Fu*k is Vorschau)

Nach dieser Erkenntnis habe ich dann den Benutzernamen eines Administratorkontos verwendet, dessen UID sowie GID in das Dockerfile eingetragen und das Image neu erstellt. Nach dem Starten des Containers und das Aufschalten per SSH landete ich dann im angegebenen Benutzer-Home-Ordner und im /docker Ordner auf der DS liefen die Config-Dateien des mc sowie die bash_history ein. Das funktioniert jetzt also. Perfekt.

Was dagegen nicht mehr funktioniert hat, war das Anlegen des Ordners /git im Benutzer-Home-Ordner sowie das setzten der globalen Einstellungen für git, welche ich im Dockerfile definiert hatte. Das hatte gestern jedoch noch funktioniert. Aber gut. Das soll jetzt nicht Gegenstand dieser Diskussion werden. Ich spiele eh noch weiter mit diesem Dockerfile herum, bis ich ein gutes, sinnvolles und "out of the box" lauffähiges Setup gefunden habe.

Nochmals danke an euch drei, das ihr mir dabei geholfen habt, das Rätsel für mich zu enträtseln.

Tommes
 

alexhell

Benutzer
Sehr erfahren
Mitglied seit
13. Mai 2021
Beiträge
2.612
Punkte für Reaktionen
759
Punkte
154
Du hast einen User dafür auf der DS angelegt und dessen UID im Dockerfile eingetragen? Du könntest auch einfach die User ID beim docker run mitgeben. Dann ist es nicht fest hard coded drin. Du musst ja nur sorgen, dass die UID aus dem Container für die Ordner benutzt wird. Die User auf der DS sind da völlig egal und haben nichts mit dem Container zu tun.
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.155
Punkte für Reaktionen
1.116
Punkte
314
Nur fürs Protokoll. Ich nutze Docker seit ungefähr ... :unsure: ... zwei Wochen ... ⁉️ von daher bitte ich um etwas Nachsicht, wenn ich nicht gleich alles perfekt und regelkonform umsetzte.

Du hast einen User dafür auf der DS angelegt und dessen UID im Dockerfile eingetragen?

Das lag für mich nahe, ja. Eben, weil im weiter oben verlinkten Tutorial das genauso gemacht wurde. Mir ist zunächst erst einmal wichtig, zu verstehen, wie das alles überhaupt funktioniert. Die Feinheiten kommen dann irgendwann von selbst.

Tommes
 

alexhell

Benutzer
Sehr erfahren
Mitglied seit
13. Mai 2021
Beiträge
2.612
Punkte für Reaktionen
759
Punkte
154
Das war ja auch kein Vorwurf.... War nur ein Hinweis, dass du das als jeden User laufen lassen kannst und nicht extra dafür User anlegen musst.
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.155
Punkte für Reaktionen
1.116
Punkte
314
Alles gut. Ich bin ja für jeden Hinweis und jede Hilfe dankbar.
 


 

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