两种挂载写法
挂载有两种等价写法:-v 简写紧凑,但源路径不存在时会静默创建(宿主目录或命名卷);--mount 使用键值对,源不存在时直接报错。生产部署建议用 --mount,让拼写错误在启动那一刻就暴露,而不是变成「应用读到一个空目录」这种一时看不出原因的现象。
基本信息
| 简写 -v | 源:目标:选项,例如 -v appdata:/data:ro |
|---|---|
| 显式 --mount | type=volume,src=appdata,dst=/data,readonly |
| bind 显式写法 | type=bind,src=/data/www,dst=/web,readonly |
| 关键差异 | --mount 在源不存在时报错;-v 会静默创建目录或卷 |
| 只读挂载 | -v 用 ro,--mount 用 readonly,效果相同 |
| 核对结果 | docker inspect -f '{{json .Mounts}}' 容器名 |
选择建议
| 场景 | 建议写法 | 原因 |
|---|---|---|
| 快速试验 | -v | 少打字,容忍自动创建 |
| 生产部署 | --mount | 显式写法防止拼错,错误立即暴露 |
| NFS 与临时内存盘 | --mount | 支持完整的 type 与选项参数 |
| Windows 宿主路径 | --mount | 路径解析与报错行为更可控 |
| 只读共享配置 | 两者均可,显式写只读 | 避免应用误写共享配置 |
典型使用场景
- 生产部署挂载数据卷与配置文件,要求可审计且不容拼写错误
- 只读挂载证书与配置文件,防止容器内进程意外改写
- 挂载宿主目录输出日志,便于宿主侧统一采集
- 把构建产物输出到宿主目录,供后续步骤打包
- 跨平台环境统一挂载写法,减少 Windows 与 Linux 的路径差异
对照示例
对照示例
docker run -v appdata:/data nginx:1.27
docker run --mount type=volume,src=appdata,dst=/data nginx:1.27
docker run --mount type=bind,src=/data/www,dst=/web,readonly nginx:1.27
docker run -v /data/www:/web:ro nginx:1.27 # 与上一行等价
docker inspect -f '{{json .Mounts}}' web # 核对实际挂载结果两种语法可以混用,但不要对同一目标路径重复挂载:后写的会覆盖先写的,覆盖顺序不直观,出问题时很难从启动命令看出最终生效的是哪一条。
-v 静默创建目录是最常见的事故来源:卷名或路径拼错时不会报错,应用会运行在一个全新的空目录上,表现为数据凭空消失,而真正原因藏在启动参数里,日志里没有任何线索。