GNU/Linux >> Belajar Linux >  >> Linux

Tidak dapat mengekspos volume berbasis sekering ke wadah Docker

Saya tidak dapat menduplikasi masalah Anda secara lokal. Jika saya mencoba mengekspos sistem file encfs sebagai volume Docker, saya mendapatkan kesalahan saat mencoba memulai wadah:

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

Jadi mungkin saja Anda mengalami sesuatu yang berbeda. Bagaimanapun, inilah yang memecahkan masalah saya:

Secara default, FUSE hanya mengizinkan pengguna yang memasang sistem file untuk memiliki akses ke sistem file itu. Saat Anda menjalankan container Docker, container tersebut awalnya dijalankan sebagai root .

Anda dapat menggunakan allow_root atau allow_other opsi pemasangan saat Anda memasang sistem file FUSE. Misalnya:

$ encfs -o allow_root /encrypted /other

Di sini, allow_root akan mengizinkan pengguna root untuk memiliki akses ke mountpoint, sedangkan allow_other akan mengizinkan siapa pun untuk memiliki akses ke mountpoint (asalkan izin Unix pada direktori mengizinkan mereka mengakses).

Jika saya memasang sistem file encfs menggunakan allow_root , saya kemudian dapat mengekspos sistem file itu sebagai volume Docker dan konten sistem file tersebut terlihat dengan benar dari dalam wadah.


Ini pasti karena Anda memulai daemon docker sebelum host memasang mountpoint. Dalam hal ini inode untuk nama direktori masih mengarah ke disk lokal host:

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

lalu jika Anda memasang menggunakan daemon sekering seperti s3fs:

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

Dugaan saya adalah bahwa buruh pelabuhan melakukan caching bootstrap dari nama direktori ke inode (seseorang yang memiliki lebih banyak pengetahuan tentang ini daripada yang dapat mengisi kekosongan ini).

Komentar Anda benar. Jika Anda cukup me-restart buruh pelabuhan setelah pemasangan selesai, volume Anda akan dibagikan dengan benar dari host ke wadah Anda. (Atau Anda dapat menunda memulai buruh pelabuhan sampai setelah semua tunggangan Anda selesai dipasang)

Apa yang menarik (tetapi buat saya lengkap sekarang) adalah bahwa setelah keluar dari wadah dan melepas mountpoint pada host, semua tulisan saya dari dalam wadah ke volume bersama secara ajaib muncul (mereka disimpan di inode pada disk lokal mesin host):

[[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. Katakan saja tidak untuk root (dalam wadah)

  2. Pengantar Docker

  3. Memperbarui container yang di-deploy berdasarkan image Docker

  1. Tidak dapat menghapus direktori di Unix

  2. Meneruskan port host ke wadah buruh pelabuhan

  3. Menjelajahi sistem file kontainer Docker

  1. Mulai Layanan Secara Otomatis di Docker Container

  2. Bagaimana saya bisa mendapatkan informasi wadah Docker Linux dari dalam wadah itu sendiri?

  3. Docker di Docker tidak dapat memasang volume