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

时间:2018-12-05 11:45:31

标签: docker fuse s3ql

我创建了一个码头容器,其中安装了保险丝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

您认为可以进行这项工作吗?

1 个答案:

答案 0 :(得分:3)

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

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

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

根据您的问题,您可能希望使用rshared选项,该选项将允许在主机上看到容器内的安装。这意味着您的docker命令行类似于:

docker run --rm \
  --mount type=bind,source=/s3ql,target=/s3ql,bind-propogation=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-propogation=rshared \
  --cap-add SYS_ADMIN --device /dev/fuse --name myContainer \
  myS3qlIimage sh -c 'mount.s3ql swiftks://url:container /s3ql; sleep inf'

(这假设您有sleep命令的版本,该命令支持inf参数可以永远休眠)。

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

相关问题