GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Ein Fuse-basiertes Volume kann nicht für einen Docker-Container verfügbar gemacht werden

Ich bin nicht in der Lage, Ihr Problem lokal zu duplizieren. Wenn ich versuche, ein encfs-Dateisystem als Docker-Volume bereitzustellen, erhalte ich beim Versuch, den Container zu starten, eine Fehlermeldung:

FATA[0003] Error response from daemon: Cannot start container <cid>:
setup mount namespace stat /visible: permission denied 

Es ist also möglich, dass bei dir etwas anderes vor sich geht. Auf jeden Fall hat dies mein Problem gelöst:

Standardmäßig erlaubt FUSE nur dem Benutzer, der ein Dateisystem gemountet hat, Zugriff auf dieses Dateisystem. Wenn Sie einen Docker-Container ausführen, wird dieser Container anfänglich als root ausgeführt .

Sie können den allow_root verwenden oder allow_other Mount-Optionen, wenn Sie das FUSE-Dateisystem mounten. Zum Beispiel:

$ encfs -o allow_root /encrypted /other

Hier, allow_root erlaubt dem Root-Benutzer den Zugriff auf den Einhängepunkt, während allow_other erlaubt jedem Zugriff auf den Einhängepunkt (vorausgesetzt, dass die Unix-Berechtigungen für das Verzeichnis ihnen Zugriff erlauben).

Wenn ich von encfs filesytem mit allow_root gemountet habe , kann ich dieses Dateisystem dann als Docker-Volume und verfügbar machen der Inhalt dieses Dateisystems ist innerhalb des Containers korrekt sichtbar.


Dies liegt definitiv daran, dass Sie den Docker-Daemon gestartet haben, bevor der Host den Mountpoint gemountet hat. In diesem Fall zeigt der Inode für den Verzeichnisnamen immer noch auf die lokale Festplatte des Hosts:

ls -i /mounts/
1048579 s3-data-mnt

dann, wenn Sie mit einem Fuse-Daemon wie s3fs mounten:

/usr/local/bin/s3fs -o rw -o allow_other -o iam_role=ecsInstanceRole /mounts/s3-data-mnt
ls -i
1 s3-data-mnt

Meine Vermutung ist, dass Docker einige Bootstrap-Caching der Verzeichnisnamen in Inodes durchführt (jemand, der mehr darüber weiß, als diese Lücke ausfüllen kann).

Ihr Kommentar ist richtig. Wenn Sie Docker nach Abschluss des Mountens einfach neu starten, wird Ihr Volume korrekt vom Host zu Ihren Containern geteilt. (Oder Sie können das Starten von Docker einfach verzögern, bis alle Ihre Mounts fertig gemountet sind)

Was interessant ist (aber für mich jetzt komplett ist), ist, dass beim Verlassen des Containers und beim Unmounten des Mountpoints auf dem Host alle meine Schreibvorgänge aus dem Container auf das freigegebene Volume auf magische Weise erschienen (sie wurden am Inode gespeichert). die lokale Festplatte des Host-Rechners):

[[email protected] s3-data-mnt]# echo foo > bar
[[email protected] s3-data-mnt]# ls /mounts/s3-data-mnt
total 6
1 drwxrwxrwx  1 root root    0 Jan  1  1970 .
4 dr-xr-xr-x 28 root root 4096 Sep 16 17:06 ..
1 -rw-r--r--  1 root root    4 Sep 16 17:11 bar
[[email protected] s3-data-mnt]# docker run -ti -v /mounts/s3-data-mnt:/s3-data busybox /bin/bash
[email protected]:/mounts/s3-data# ls -als
total 8
4 drwxr-xr-x  3 root root 4096 Sep 16 16:05 .
4 drwxr-xr-x 12 root root 4096 Sep 16 16:45 ..
[email protected]:/s3-data# echo baz > beef
[email protected]:/s3-data# ls -als
total 9
4 drwxr-xr-x  3 root root 4096 Sep 16 16:05 .
4 drwxr-xr-x 12 root root 4096 Sep 16 16:45 ..
1 -rw-r--r--  1 root root    4 Sep 16 17:11 beef
[email protected]:/s3-data# exit
exit
[[email protected] s3-data-mnt]# ls /mounts/s3-data-mnt
total 6
1 drwxrwxrwx  1 root root    0 Jan  1  1970 .
4 dr-xr-xr-x 28 root root 4096 Sep 16 17:06 ..
1 -rw-r--r--  1 root root    4 Sep 16 17:11 bar
[[email protected] /]# umount -l s3-data-mnt
[[email protected] /]# ls -als
[[email protected] /]# ls -als /s3-stn-jira-data-mnt/
total 8
4 drwxr-xr-x  2 root root 4096 Sep 16 17:28 .
4 dr-xr-xr-x 28 root root 4096 Sep 16 17:06 ..
1 -rw-r--r--  1 root root    4 Sep 16 17:11 bar

Linux
  1. Ein Verzeichnis kann in Unix nicht entfernt werden

  2. Leiten Sie den Host-Port an den Docker-Container weiter

  3. Automatisches Starten von Diensten im Docker-Container

  4. Erkunden des Dateisystems des Docker-Containers

  5. Wie kann ich Docker-Linux-Containerinformationen aus dem Container selbst abrufen?

BTFS – Ein auf FUSE basierendes Bittorrent-Dateisystem

Wie kann ein Benutzer einen verschlüsselten Dateicontainer in Veracrypt mounten?

So fügen Sie einem vorhandenen Docker-Container ein Volume hinzu

So greifen Sie auf Dateien außerhalb eines Docker-Containers zu

So führen Sie SSH in einen Docker-Container ein

So verwalten Sie Docker-Container