我创建了一个码头容器,在这里我安装了一个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 /s3qldocker exec myContainer ls /s3ql显示实际的S3QL内容,但是主机上的/s3ql是空的。
关于我如何完成回购的更多细节:https://gitlab.com/Salokyn/docker-s3ql
你认为有可能做到这一点吗?
发布于 2018-12-05 12:14:23
通常,当您启动Docker容器时,它在一个私有挂载命名空间中运行:这意味着(a)安装在容器中的文件系统在主机上不可见,(b)安装在主机上的文件系统在容器中不可见。
可以使用绑定-传播标志将此行为修改为--mount选项。此标志有六个可用的值:
shared:原始挂载的子挂载向复制挂载公开,复制挂载的子挂载也传播到原始挂载。slave:类似于共享挂载,但只有一个方向。如果原始挂载公开一个子挂载,复制挂载可以看到它.但是,如果副本挂载公开了一个子挂载,则原始挂载无法看到它.private:挂载是私有的。它内的子挂载不暴露于复制挂载,而复制挂载的子挂载不暴露于原始挂载。rshared:与shared相同,但传播也扩展到嵌套在任何原始或副本挂载点内的挂载点。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但是这里可能还有第二个问题:如果您的fuse挂载需要一个持久的进程才能正常工作,这是行不通的,因为您的容器将在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'(这假设您有一个支持inf参数永久休眠的inf命令的版本)。
https://stackoverflow.com/questions/53631567
复制相似问题