通过卷共享安装在Docker容器内的FUSE FS

Nic*_*Gif 4 fuse docker s3ql

我创建了一个docker容器,在其中安装了保险丝S3QL FS。这正在工作。

现在,我希望能够与主机或其他容器共享此安装点,但是它不起作用。

简而言之,我以这种方式运行容器:

docker run --rm -d -v /s3ql:/s3ql \
           --cap-add SYS_ADMIN --device /dev/fuse \
           --name myContainer \
                myS3qlIimage mount.s3ql swiftks://url:container /s3ql
Run Code Online (Sandbox Code Playgroud)

docker exec myContainer ls /s3ql显示实际的S3QL内容,但/s3ql主机上为空。

到目前为止,我在仓库中的操作方式的更多详细信息:https : //gitlab.com/Salokyn/docker-s3ql

您认为有可能使它起作用吗?

lar*_*sks 5

通常,启动Docker容器时,它会在私有安装名称空间中运行:这意味着(a)容器内安装的文件系统在主机上不可见,(b)主机上安装的文件系统将不可见在容器内可见。

您可以使用选项的bind-propagation标志来修改此行为--mount。此标志有六个值可用:

  • shared:原始安装的子安装公开给复制安装,复制安装的子安装也传播到原始安装。
  • slave:类似于共享安装,但仅在一个方向上。如果原始安装公开了子安装,则副本安装可以看到它。但是,如果副本安装公开了子安装,则原始安装看不到它。
  • private:坐骑是私人的。其中的子安装不暴露于副本安装,副本安装的子安装也不暴露于原始安装。
  • rshared:与共享相同,但传播也扩展到嵌套在任何原始或副本安装点内的安装点,以及从这些安装点扩展。
  • rslave:与从属服务器相同,但是传播还扩展到嵌套在任何原始或副本安装点中的安装点以及从这些安装点扩展。
  • rprivate:默认值。与私有相同,这意味着原始或复制副本安装点中的任何位置都不会在任何方向传播。

根据您的问题,您可能希望使用该rshared选项,该选项将允许在主机上可见容器内的安装。这意味着您的docker命令行如下所示:

docker run --rm \
  --mount type=bind,source=/s3ql,target=/s3ql,bind-propagation=rshared \
  --cap-add SYS_ADMIN --device /dev/fuse --name myContainer \
  myS3qlIimage mount.s3ql swiftks://url:container /s3ql
Run Code Online (Sandbox Code Playgroud)

但是这里可能存在第二个问题:如果您的保险丝座需要一个持续的过程才能起作用,这将不起作用,因为您的容器将在mount命令完成后立即退出,并执行所有过程。在这种情况下,您需要安排容器挂起的时间,只要您需要激活挂载:

docker run -d \
  --mount type=bind,source=/s3ql,target=/s3ql,bind-propagation=rshared \
  --cap-add SYS_ADMIN --device /dev/fuse --name myContainer \
  myS3qlIimage sh -c 'mount.s3ql swiftks://url:container /s3ql; sleep inf'
Run Code Online (Sandbox Code Playgroud)

(这假定您具有sleep支持inf永久睡眠参数的命令版本)。

还要注意,组合--rm-d没有任何意义:该--rm选项由客户端实现,并且由于-d在容器保持运行的同时客户端退出,因此没有任何东西可以处理该--rm选项。