【发布时间】:2013-03-19 13:24:48
【问题描述】:
如何将目录从主机挂载到 Docker 中的容器?
【问题讨论】:
如何将目录从主机挂载到 Docker 中的容器?
【问题讨论】:
作为最终更新,该功能现已在 Docker 中发布(尽管 API 在@imiric 链接的拉取请求后发生了变化)。
只需使用类似的命令
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 的镜像。
$CMD的输出?似乎 -i 选项抑制来自docker run 的输出。
docker run 中的 -v 选项。更多信息如下。
-v 命令行开关的答案可能是个好主意
只是为了更新这个问题,这很快就会在 Docker 中成为可能。
This pull request已经实际实现了这个功能,很快会合并到master。
如果你安装this fork,你现在就可以使用它。
【讨论】:
这在 Docker 中是可能的:
将数据挂载到应用容器中:
docker run -t -i -rm -volumes-from DATA -name client1 ubuntu bash
【讨论】:
两个连续的挂载:我猜这里的很多帖子可能使用了两个 boot2docker。您看不到任何内容的原因是因为您正在从 boot2docker 安装目录,而不是从主机安装目录。您基本上需要两个连续的挂载:第一个将目录从您的主机挂载到您的系统,第二个将新目录从 boot2docker 挂载到您的容器,如下所示:
在 boot2docker 上挂载本地系统:
sudo mount -t vboxsf hostfolder /boot2dockerfolder
在 Linux 容器上挂载 boot2docker 文件
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>
【讨论】: