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

尼古拉斯·吉夫

我创建了一个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

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

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

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

幼虫

通常,当您启动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

但是这里可能存在第二个问题:如果您的保险丝座需要一个持续的过程才能起作用,这将不起作用,因为您的容器将在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'

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章