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