GNU/Linux >> Znalost Linux >  >> Linux

Nelze vystavit svazek založený na pojistce kontejneru Docker

Nemohu lokálně duplikovat váš problém. Pokud se pokusím vystavit souborový systém encfs jako svazek Docker, zobrazí se chyba při pokusu o spuštění kontejneru:

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

Takže je možné, že se děje něco jiného. V každém případě to je to, co můj problém vyřešilo:

Ve výchozím nastavení FUSE povoluje přístup k tomuto souborovému systému pouze uživateli, který připojil souborový systém. Když spouštíte kontejner Docker, tento kontejner je zpočátku spuštěn jako root .

Můžete použít allow_root nebo allow_other možnosti připojení při připojení souborového systému FUSE. Například:

$ encfs -o allow_root /encrypted /other

Zde allow_root umožní uživateli root mít přístup k bodu připojení, zatímco allow_other umožní komukoli mít přístup k přípojnému bodu (za předpokladu, že mu unixová oprávnění v adresáři umožňují přístup).

Pokud jsem se připojil pomocí souborového systému encfs pomocí allow_root , mohu pak tento souborový systém vystavit jako svazek Docker a obsah tohoto souborového systému je správně viditelný zevnitř kontejneru.


Je to určitě proto, že jste spustili démona dockeru předtím, než hostitel připojil přípojný bod. V tomto případě inode pro název adresáře stále ukazuje na místní disk hostitele:

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

pak pokud připojíte pomocí pojistkového démona jako s3fs:

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

Hádám, že docker provádí nějaké bootstrapové ukládání názvů adresářů do inodů (někdo, kdo o tom má více znalostí, než může vyplnit toto prázdné místo).

Váš komentář je správný. Pokud po dokončení připojení jednoduše restartujete docker, váš svazek bude správně sdílen z hostitele do vašich kontejnerů. (Nebo můžete jednoduše odložit spuštění dockeru, dokud nebudou dokončeny všechny vaše držáky)

Co je zajímavé (ale nyní je to pro mě kompletní) je, že po opuštění kontejneru a odpojení bodu připojení na hostiteli se všechny mé zápisy z kontejneru do sdíleného svazku magicky objevily (byly uloženy v inodu na místní disk hostitelského počítače):

[[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. Nelze odstranit adresář v Unixu

  2. Předat hostitelský port do kontejneru dockeru

  3. Automaticky spouštět služby v kontejneru Docker

  1. Prozkoumání systému souborů kontejneru Docker

  2. Může docker běžet uvnitř linuxového kontejneru?

  3. Docker v Dockeru nemůže připojit svazek

  1. Stačí říct ne rootovi (v kontejnerech)

  2. Úvod do Dockeru

  3. Nelze přečíst certifikát při spuštění v kontejneru Linux Docker - funguje ve Windows