趋近智
容器提供了独立环境,但这种隔离在您需要访问或修改位于容器外部的文件时会带来一个难题,尤其是在您的机器学习 (machine learning)项目活跃开发阶段。每次修改一行Python代码或更新配置文件时都重建Docker镜像效率低下,并且会明显减慢迭代周期。
这就是绑定挂载起作用的地方。绑定挂载在您的宿主机(您计算机的文件系统)上的目录或文件与容器内部的目录或文件之间建立一个直接的链接或映射。与Dockerfile中的COPY指令不同,COPY指令在构建时创建文件的静态快照,而绑定挂载提供了一个实时、动态的连接。对宿主系统上已挂载目录或文件的更改会立即反映在容器内部,反之(取决于权限),在容器内已挂载路径中所做的更改也可能影响宿主系统的文件。
可以把它想象成在您的宿主机和容器之间创建一个共享文件夹。这种直接访问在开发过程中非常有用,原因有以下几点:
当您使用docker run命令启动容器时,就可以创建绑定挂载。主要有两种标志用于此目的:
-v 或 --volume 标志(更简洁的语法):
docker run -v /path/on/host:/path/in/container image_name [command]
此语法将您计算机上的/path/on/host直接映射到容器内部的/path/in/container。
--mount 标志(更明确的语法):
docker run --mount type=bind,source=/path/on/host,target=/path/in/container image_name [command]
这种语法因其清晰性而常被选用。它明确指出type是bind,source是宿主路径,target是容器路径。如果需要,您还可以添加其他选项,例如readonly。
我们来看一个常见的机器学习 (machine learning)开发场景。假设您的宿主机上有一个项目结构如下所示:
/home/user/my_ml_project/
├── src/
│ └── train.py
├── data/
│ └── features.csv
└── Dockerfile
您已经使用包含Python、scikit-learn和pandas的Dockerfile构建了一个名为my-ml-dev-env的镜像。现在,您想在容器内运行train.py脚本,使用features.csv数据,同时仍然能够在您的宿主机上编辑train.py。
您可以使用绑定挂载来实现这一点:
# 使用 --mount 语法
docker run --rm -it \
--mount type=bind,source=/home/user/my_ml_project/src,target=/app/src \
--mount type=bind,source=/home/user/my_ml_project/data,target=/app/data \
my-ml-dev-env \
python /app/src/train.py --data_path /app/data/features.csv
或者使用-v简写:
# 使用 -v 语法
docker run --rm -it \
-v /home/user/my_ml_project/src:/app/src \
-v /home/user/my_ml_project/data:/app/data \
my-ml-dev-env \
python /app/src/train.py --data_path /app/data/features.csv
在以上两个例子中:
src目录映射到容器内部的/app/src。data目录映射到容器内部的/app/data。/app/src内的train.py脚本。/app/data访问数据。现在,如果您在宿主机上打开/home/user/my_ml_project/src/train.py并进行更改,这些更改将在您下次运行docker run命令时立即生效(或者,如果您在容器内运行交互式shell或服务器,则在访问文件时会立即反映这些更改)。
该图示说明了如何使用绑定挂载,将宿主机上的目录(
my_ml_project/src、my_ml_project/data)直接映射到容器的文件系统(/app/src、/app/data)中。
虽然绑定挂载对开发来说功能强大,但请记住以下几点:
docker run命令的宿主机上存在。如果镜像严重依赖于挂载特定的宿主路径,这将降低镜像的可移植性。C:\Users\...) 和 Linux/macOS (/home/user/...) 上指定方式不同。在跨不同开发环境共享docker run命令或脚本时,请注意这一点。绑定挂载是简化机器学习 (machine learning)开发内部循环的不可或缺的工具:在Docker容器提供的一致环境中编辑代码、运行实验和访问本地资源。当您需要那种直接、实时连接时,它们正好弥合了宿主机与容器化环境之间的差距。然而,为了更稳定地管理持久数据,尤其是在非开发场景或在容器之间共享数据时,Docker提供了另一种机制:卷(Volumes),我们接下来将查看它。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•