Docker中使用-v参数创建命名卷却生成绑定挂载的问题咨询
Docker -v 参数挂载类型判定规则
Docker的-v/--volume参数的挂载类型完全由冒号前的第一段内容格式决定,你每次都生成绑定挂载的核心原因是冒号前的内容命中了绑定挂载的判定规则:
- 只要冒号前的内容是绝对路径或者以./、../开头的相对路径,Docker就会判定为绑定挂载
- 只要冒号前的内容是不包含路径分隔符
/的纯字符串,Docker就会判定为命名卷,不存在的情况下会自动创建该命名卷
你给出的命令说明
第一条为标准命名卷挂载命令:
docker run -d \ --name devtest \ -v myvol2:/app \ nginx:latest
该命令中myvol2不包含路径分隔符,会作为命名卷处理,执行docker volume ls即可在命名卷列表中看到myvol2条目。
第二条为标准绑定挂载命令:
docker run -d \ -it \ --name devtest \ -v "$(pwd)"/target:/app \ nginx:latest
该命令中$(pwd)会被解析为当前工作目录的绝对路径,冒号前最终为绝对路径,自然会生成为绑定挂载。
常见问题排查
如果你执行命名卷创建命令仍生成绑定挂载,可优先检查以下两点:
- 是否误在卷名前加了相对路径前缀,比如写成
-v ./myvol2:/app - 是否卷名中包含
/符号,比如写成-v my/vol2:/app
你可以在容器启动后执行docker inspect devtest -f "{{ .Mounts }}"查看挂载详情,Type字段为volume即为命名卷,为bind即为绑定挂载。
内容的提问来源于stack exchange,提问作者Paulina Paiz
相关产品推荐
相关产品推荐

