Daten werde nicht in Mount geschrieben

bitmuncher

Senior-Nerd
Ich hab hier gerade ein ziemlich seltsames Problem. Ich hab einen Linux-Server (AWS-EC2-Instanz), der mittels Docker ein Volume aus /home/mongo/data erstellt. /home/mongo ist hierbei ein Mountpoint für /dev/xvdi. Selbst wenn die Partition gemountet ist, wird aber nicht auf die Partition geschrieben sondern auf /dev/xvda1, wo sich der Mountpoint befindet. Mit anderen Worten: Anstatt auf die gemountete Partition wird auf die (Root)-Partition geschrieben, auf der sich der Mountpoint befindet.

Daten dazu:

Der Container wird ausgeführt mit:

Code:
docker run --name mongo -v /home/mongo/data:/data/db ...

Die Partition ist auch korrekt gemountet, wie man der mtab entnehmen kann:

Code:
/dev/xvdi /home/mongo ext4 rw,noatime,data=ordered 0 0

Auch 'df' erkennt die Partition als gemountet:

Code:
/dev/xvdi       493G   70M  467G   1% /home/mongo

Der data-Ordner existiert auch im Mountpoint:

Code:
total 28K
drwxr-xr-x 4 root root 4.0K Oct 10 23:11 .
drwxr-xr-x 7 root root 4.0K Oct 10 23:03 ..
drwxr-xr-x 2 root root 4.0K Oct 10 23:11 data
...

Dennoch wird der data-Ordner immer wieder auf der "dahinter liegenden" Partition erstellt, wie ich sehen kann sobald ich /home/mongo unmounte. Dann ist in dem zuvor leeren Mountpoint nämlich plötzlich ein Ordner 'data'.

Testweise habe ich auch mal das Immutable-Bit auf /home/mongo gesetzt um sicherzustellen, dass darin nur geschrieben werden kann, wenn die zugehörige Partition gemountet ist. Das führt aber dazu, dass das Starten des Docker-Containers schief geht:

Code:
Error response from daemon: mkdir /home/mongo/data: permission denied.

Offenbar versucht Docker also einen Ordner zu erstellen, obwohl dieser bereits da ist, wenn die Partition eingehängt ist.

Jemand eine Idee dazu oder schonmal eine ähnliche Situation gehabt, in der Daten in die Root-Partition anstatt in die gemountete geschrieben werden?
 
Nach einigen Stunden der Fehlersuche, hat sich die Lösung als so einfach erwiesen, dass man kaum hätte drauf kommen können. ;) Das Problem existiert dann, wenn der Docker-Daemon bereits läuft, wenn die Partition gemountet wird. Offenbar liest er die mtab nur beim Start ein und läuft dann aufgrund der virtualisierten Storage-Layer auf den Partitionen, die er beim Start erkannt hat. Da ich die Partition erst im Nachhinein gemountet hatte, kannte der Docker-Daemon diese nicht. Ein simpler Restart des Docker-Daemons nach dem Einhängen der Partition hat daher Abhilfe geschaffen.

Insgesamt greift das Problem allerdings weiter, da man sicherstellen muss, dass der Docker-Daemon erst startet, wenn alle Partitionen gemountet sind. Bei systemd bedeutet dies, dass man Abhängigkeiten zu anderen Targets definieren muss, die möglichst lange dauern beim Start, so dass Docker erst relativ spät dran kommt. Beim SysVinit kann man natürlich einfach Docker als S99-docker in's entsprechende Runlevel verlinken.
 
Zurück
Oben