我该如何将宿主机上的目录挂载到Docker容器中?
最后更新一下,这个功能现在已经发布在 Docker 中了(尽管与 @imiric 链接的拉请求中的 API 已更改)。
只需使用类似以下命令:
docker run -v /tmp:/root myImage
为了将主机的/tmp
挂载到镜像中的/root
。
*更新 - 请参见下面的答案。这不再是正确的答案*
设计上你不能够挂载它们,因为 Docker 无法保证可重复的执行环境。
但是你可以:
导入主机的根文件系统并从中创建一个新的镜像:
tar -C / -c . | docker import - entend/custombase
导入一个引导根文件系统,例如运行 'debootstrap' 的结果。(请注意,这就是官方的“基础”镜像是如何创建的,所以你最好只运行 'docker pull base') debootstrap precise ./bootstrap
tar -C ./bootstrap -c . | docker import - entend/ubuntubase
在运行容器时将本地目录的内容注入到其中。
IMAGE=base; SRC=./stuff; DST=/tmp/stuff; CMD="echo hello world"; tar -C $src -c . | docker run $IMAGE -i /bin/sh -c "tar -C $DST -x; $CMD"
这将从$IMAGE运行一个容器,将主机目录$SRC复制到容器目录$DST,然后运行命令$CMD。
最后一个示例通常用于在容器内运行构建命令之前插入源代码。
-i
标志需要在镜像之前,否则 docker run
将尝试查找名为 -i
的镜像。 - Kevin L.$CMD
的输出?似乎-i选项会抑制docker run
的输出。 - Naveeddocker run
中的-v
选项,这已成为Docker中的一流选项。以下是更多信息。 - user2089674docker run -t -i -rm -volumes-from DATA -name client1 ubuntu bash
连续两次挂载:我猜这里的许多帖子可能正在使用两个boot2docker。你看不到任何东西的原因是因为你挂载了一个来自boot2docker而不是主机的目录。你基本上需要连续两次挂载:第一个是将主机上的目录挂载到系统中,第二个是将boot2docker上的新目录挂载到容器中,像这样:
Mount local system on boot2docker:
sudo mount -t vboxsf hostfolder /boot2dockerfolder
Mount boot2docker file on a Linux container
docker run -v /boot2dockerfolder:/root/containerfolder -i -t imagename
ls
命令时,你将看到主机文件夹的内容。Dockerfile解决方案
在您的Dockerfile
中添加以下行,将数据从主机复制到创建的镜像(容器)中。
# Other lines of Dockerfile
COPY <relative-or-absolute-path-of-the-directory-in-host-machine> <relative-or-absolute-path-of-the-directory-in-container>
# Example:
# COPY ./redis/data/:/db_data
P.S.:容器是正在运行的镜像。
Docker-compose 解决方案
在 docker-compose 文件中,可以通过多种方式定义卷。其中一种方式是将主机机器的目录地址挂载到容器中(类似于我们在dockerfile解决方案中所做的)作为您服务的一部分:
volumes:
- <relative-or-absolute-path-of-the-directory-in-host-machine>:<relative-or-absolute-path-of-the-directory-in-container>