绑定挂载默认为rprivate传播,仅--mount支持配置bind-propagation(如rshared),-v不支持且会静默忽略:shared等后缀;传播模式须带r前缀,典型场景需主机和容器均设rshared才能双向同步。
绑定挂载(bind mount)默认使用 rprivate 传播模式,即既不接收也不传播挂载事件。如需启用共享(shared)、从属(slave)等传播行为,必须显式配置挂载传播选项——这不能靠 -v 完成,只能通过 --mount 指定 bind-propagation 参数实现。
必须用 --mount,-v 不支持传播配置
-v 和 --volume 是历史遗留语法,其行为已冻结,**完全不支持设置挂载传播**。即使你在 -v 后加 :shared 或类似后缀,Docker 会静默忽略,仍按 rprivate 处理。
- ✅ 正确写法(使用
--mount):docker run --mount type=bind,source=/host/path,target=/container/path,bind-propagation=shared nginx - ❌ 错误写法(
-v无效):docker run -v /host/path:/container/path:shared nginx——:shared被丢弃,实际仍是rprivate
可用的传播模式及含义
传播模式区分大小写,且必须带前缀 r(recursive),表示递归应用到子挂载点:
-
rshared:双向传播。本挂载点和所有具有共享关系的挂载点之间,挂载/卸载操作互相同步 -
rslave:单向传播(只接收)。本挂载点接收来自主挂载点的事件,但自身变化不反向传播 -
rprivate:默认值。完全隔离,无任何传播 -
runbindable:禁止绑定挂载(即不允许mount --bind复制该挂载)
注意:shared(无 r)或 slave 等非递归形式在现代内核和 Docker 中已不被接受,会报错。
典型场景配置示例
常见需求是让容器内挂载点能响应主机侧新增的绑定挂载(例如开发中动态挂载新模块目录):
- 主机上先创建共享挂载点:
sudo mount --make-rshared /host/data - 再启动容器并继承该传播属性:
docker run --mount type=bind,source=/host/data,target=/app,bind-propagation=rshared nginx - 之后在主机执行:
sudo mount --bind /host/data/ext /host/data/ext
容器内/app/ext会自动可见 —— 这依赖双方都是rshared
验证是否生效
运行容器后,进入容器或宿主机检查挂载信息:
- 在容器内执行:
findmnt -o TARGET,PROPAGATION /app
输出应为/app rshared或对应模式 - 或用
docker inspect 容器名查看Mounts字段中的Propagation值
若显示 rprivate,说明配置未生效,大概率用了 -v 或漏写 r 前缀。











