9

我创建了一个 docker 容器,在其中安装了一个 fuse 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

你认为有可能做到这一点吗?

4

1 回答 1

15

通常,当您启动 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永远睡眠参数的命令版本)。

于 2018-12-05T12:14:23.787 回答