Ubuntu Image - Dockerfile - Homeverzeichnis

Tommes

Well-known member
Hi!

Ich habe mich vor kurzem aufgemacht, in die Welt der Virtualisierung einzutauchen, strampel bisher aber nur auf der Wasseroberfläche rum. Wie dem auch sei...

Ich habe mir anhand dieser Anleitung über ein Dockerfile einen "einfachen" Ubuntu Container inkl. SSH Zugriff zusammengebastelt, was erstmal auch kein großes Problem war. Läuft. In dem Dockerfile wird unter anderem für den Benutzer "ubuntu" in dieser Zeile...
Bash:
# Create user and set password for user and root user
RUN  useradd -rm -d /home/ubuntu ... ...
...mit dem Optionsschalter -m des Befehls useradd das Homeverzeichnis /home/ubuntu erstellt. Soweit auch alles klar. Starte ich im Anschluss den fertigen Container, ist das Homeverzeichnis auch vorhanden. Super!

Nun zu meinem Problem bzw. zu dem, was ich nicht verstehe.
Mein Ziel war es nun, über das Dockerfile, innerhalb des Homeverzeichnisses /home/ubunutu im Anschluss einen weiteren Ordner zu erstellen. Also sowas hier...
Bash:
RUN mkdir -p /home/ubuntu/folder
... wobei man den Optionsschalter -p auch hätte weglassen können. Egal. Starte ich im Anschluss den Container, muss ich feststellen, das der Ordner nicht angelegt wurde. Okay dachte ich mir, dann versuch wenigstens über das Dockerfile eine einfache Datei mit...
Bash:
COPY startup.sh /home/ubuntu

... oder auch mit ...

RUN cp startup.sh /home/ubuntu/startup.sh
... in das Homeverzeichnis /home/ubuntu zu katapultieren, was am Ende aber auch nicht funktionierte.

So. Jetzt steh’ ich da und weiß nicht mehr weiter. Erstelle ich an einem anderen Ort des Ubuntu Dateisystems einen (Unter)-Ordner oder kopiere dorthin eine Datei, funktioniert das alles. Nur im Ordner /home/ubuntu funktioniert das nicht. Kann mir das bitte mal jemand erklären, warum das nicht funktioniert und wie ich es bestenfalls hinbekomme, das es funktioniert.

Tommes
 
Ich habe grade mal kurz nachgebaut und keine Ahnung, ob es richtig ist, aber so "scheint" es bei mir zu funktionieren:
Code:
RUN mkdir /home/ubuntu/test
COPY myfile.external /home/ubuntu/test
RUN chown -R ubuntu:users /home/ubuntu/test

Zumindestens sieht es im Container so aus:
ubuntu@d47862f38112:~$ ls
test
ubuntu@d47862f38112:~$ ls test/
myfile.external

EDIT: "/home/ubuntu" war da übrigens schon vorhanden (halt ein Ubuntu-Image).
 
Zuletzt bearbeitet:
Also gut. Alles nochmal zurück auf Anfang. Container gestoppt und gelöscht. Ebenso das Image.

Nachdem ich dem ich nochmal den Originalinhalt aus dem eingangs verlinkten Dockerfile hergenommen habe und darin deine Anpassungen hinzugefügt habe, funktionierte das Mistding auf einmal. Weiß der Geier woran es gelegen hat.

Ich habe dann nochmal alles gestoppt und gelöscht, dann aber im Dockerfile den Benutzernamen ubuntu gegen tommes ausgetauscht. Auch habe ich UID von 1000 auf 1026 geändert, da dies der UID meines Benutzers auf meinem Synology NAS Systems ist. Image gebaut und gestartet. Läuft.

Keine Ahnung, was ich falsch gemacht habe, aber jetzt scheint es, sogar mit abgewandelten Benutzer und UID zu funktionieren. Ich teste das vorsichtshalber aber nochmals durch um so vielleicht den Fehler zu finden. Grrrrr....

Tommes
 
Bei mir ist auch ein Fehler drin, beim chown ist die Gruppe users wohl eher nicht richtig, wenn man sich die GID vom User ubuntu im Container anschaut... 😅
ubuntu@e81bc59b2a6f:~$ id
uid=1000(ubuntu) gid=0(root) groups=0(root),27(sudo)
Aber sei's drum... Hauptsache es läuft jetzt bei Dir 😊
 
Ich glaub, ich habe den Fehler gefunden. Zuletzt habe ich den Container immer so gestartet...
docker run -d -p 2222:22 ubuntu-ssh
... und damit hat es zuletzt dann auch funktioniert.

Davor habe ich den Container immer so gestartet...
docker run -v /volume1/docker/ubuntu/home/tommes:/home/tommes -d -p 2222:22 ubuntu-ssh
... also ein Volume für die persistenten Daten auf meiner Synology NAS angegeben. Das scheint aber irgendwie nicht so richtig zu funktionieren, da sich im Odner /volume1/docker/ubuntu/home/tommes zwar durchaus Daten befinden (habe noch den mc und nano in dem Container installiert), darin befindet sich jedoch nicht der Ordner /test. Ebenso wenig befindet sich dieser Ordner im laufenden Container unter /home/tommes.

Schlussfolgere ich jetzt daraus, das wenn ich dem run Befehl eine Volumeangabe mitgebe, das mir dann immer nur der Inhalt des Ordners /volume1/docker/ubuntu/home/tommes angezeigt wird und somit der Inhalt des Ordners /home/tommes dadurch überschrieben wird? Das wäre die einzig logische Erklärung für mich.
 
Also wenn ich mich richtig an Dein Vorhaben erinnere, bräuchtest Du kein Volume, sondern eher ein bind mount.
das mir dann immer nur der Inhalt des Ordners /volume1/docker/ubuntu/home/tommes
Wenn das der Inhalt aus Deinem "Volume" ist, wird das so sein (kannst aber natürlich auch mehrere Angaben machen). Kommt halt darauf an, was Du machst (Volume vs bind mount).

meinvolume:/home/tommes (volume)
vs.
/lokaler/pfad:/home/tommes (bind mount)

Kannst auch mal hier schauen, wobei es da primär um Volumes geht.
 
Ich habe dies in Anlehnung an ein Docker-Compose-File so für mich übertragen...
volumes:
- /volume1/docker/ubuntu/home/tommes:/home/tommes

Scheinbar muss ich da doch nochmal ein wenig genauer nachlesen, wie das mit den Volumes inVerbindung mit docker run funktioniert. Aber das soll jetzt nicht Thema dieser Diskussion werden. Von daher schon mal vielen Dank für deine Hilfe.

Tommes
 
wenn ich dem run Befehl eine Volumeangabe mitgebe, das mir dann immer nur der Inhalt des Ordners /volume1/docker/ubuntu/home/tommes angezeigt wird und somit der Inhalt des Ordners /home/tommes dadurch überschrieben wird?
Wenn ein Volume/Bind auf ein Container-Verzeichnis gemapped wird, wird die entsprechende Quelle in das Container-Verzeichnis gemountet. So wie es passieren würde, wenn man mit mount --bind /quellverzeichnis /zielverzeichnis ein Verzeichnis in ein anderes Mountet - der Originalinhalt des Zielverzeichnisses ist dann nicht mehr zugreifbar.

Technisch zeigt der Pfad im Container dann auf die inode (~=physikalischer Ort im Dateisystem) des gemounteten Host Verzeichnisses. Das kann man sich gut mit `ls -li ansehen. Wende das doch mal auf dem Host und im Container an, und du wirst sehen, dass die Inode bei der Verwendung eines Binds exakt dieselbe ist wie die auf dem Host.

Wenn Du den Container mit `docker run -u 1026:100 ...` startest, dann hat der User in dem Container auch die entsprechende UID und GID.
 

Zurzeit aktive Besucher

Letzte Anleitungen

Statistik des Forums

Themen
4.618
Beiträge
47.295
Mitglieder
4.265
Neuestes Mitglied
Kleinfritzchen
Zurück
Oben