Docker Volume是复制文件还是挂载目录?如何实现仅挂载不复制?
Docker 宿主机目录挂载常见问题解答
首先要纠正一个关键错误:Dockerfile 里不能用 RUN -v ... 这种写法。-v 是容器启动命令(比如 docker run)或者 Docker Compose 配置里的参数,属于容器运行阶段的挂载指令,在构建镜像的 RUN 步骤里完全不生效。
接下来解答你的核心疑问:
- 你对「
-v会把文件复制到容器」的理解不准确,这只针对命名卷的场景:当你用-v 卷名:容器路径创建新的命名卷,且容器内的目标路径原本有文件时,Docker 才会把容器内的内容复制到命名卷里。 - 如果你是用
-v 宿主机绝对路径:容器路径这种**绑定挂载(bind mount)**的方式,完全不会有复制行为。容器里的挂载目录会直接映射到宿主机的对应目录,容器读取/写入的都是宿主机上的文件,和容器镜像里的内容无关。
至于是否要改用 --mount:--mount 是 Docker 后来推出的更清晰、更灵活的挂载语法,功能上和 -v 覆盖的场景一致。对于绑定挂载,--mount type=bind,source=/opt/P01_SH/_Library,target=/opt/P01_SH/_Library 和 -v /opt/P01_SH/_Library:/opt/P01_SH/_Library 效果完全相同,都不会复制文件,直接映射宿主机目录。你可以根据个人习惯选择,两种方式都能满足你的需求。
最后总结正确的操作方式:
不要在 Dockerfile 里配置挂载,而是在启动容器时指定:
- 用
docker run命令:docker run -v /opt/P01_SH/_Library:/opt/P01_SH/_Library 你的镜像名 - 或者用 Docker Compose,在
docker-compose.yml里配置:services: 你的服务名: image: 你的镜像名 volumes: - /opt/P01_SH/_Library:/opt/P01_SH/_Library
内容的提问来源于stack exchange,提问作者RTC222
相关产品推荐
相关产品推荐

