在Docker中将主机上的目录挂载到容器中

57

我该如何将宿主机上的目录挂载到Docker容器中?

6个回答

160

最后更新一下,这个功能现在已经发布在 Docker 中了(尽管与 @imiric 链接的拉请求中的 API 已更改)。

只需使用类似以下命令:

docker run -v /tmp:/root myImage

为了将主机的/tmp挂载到镜像中的/root

来源:https://docs.docker.com/engine/userguide/dockervolumes/


2
问:在这些路径中的任何文件更改是否会双向工作? - Alix Axel
2
@AlixAxel 是的,它们会。目录和文件驻留在主机上,该主机被挂载到容器中。您可以从任一侧编辑文件,并立即在两侧看到更改。我使用此功能将动态内容带入容器,而不会使其变得臃肿。 - Vilsepi
10
请注意,在OS-X(可能还有Windows)上,这种方法不能按照预期工作,因为Docker使用一个在ramdisk中运行的VirtualBox映像作为宿主机,所以该命令会将VB宿主机中的一个(空)文件夹挂载到镜像中。 - Peter Gibson
8
在OSX上使用boot2docker肯定行不通。 - Daniel Coffman
2
截至1.3,在OS X上使用boot2docker部分可行。它适用于/Users目录中的挂载。 - kojiro
显示剩余2条评论

13

*更新 - 请参见下面的答案。这不再是正确的答案*

设计上你不能够挂载它们,因为 Docker 无法保证可重复的执行环境。

但是你可以:

  1. 导入主机的根文件系统并从中创建一个新的镜像:

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。

    最后一个示例通常用于在容器内运行构建命令之前插入源代码。


    2
    第三个命令的语法似乎已经改变了;-i 标志需要在镜像之前,否则 docker run 将尝试查找名为 -i 的镜像。 - Kevin L.
    当使用第三种方法时,我该如何获取$CMD的输出?似乎-i选项会抑制docker run的输出。 - Naveed
    2
    作为更新,现在通过docker run中的-v选项,这已成为Docker中的一流选项。以下是更多信息。 - user2089674
    2
    也许将接受的答案更改为提到新的“-v”命令行开关的答案是一个好主意。 - Joakim

    5

    更新一下这个问题,Docker很快就会实现这个功能。

    这个拉取请求已经实现了这个功能,并且很快将被合并到主分支。

    如果你安装这个分支,你可以立即使用它。


    4
    这在Docker中是可行的: 将数据挂载到应用程序容器中:
    docker run -t -i -rm -volumes-from DATA -name client1 ubuntu bash
    

    4

    OS X和Windows的小技巧

    连续两次挂载:我猜这里的许多帖子可能正在使用两个boot2docker。你看不到任何东西的原因是因为你挂载了一个来自boot2docker而不是主机的目录。你基本上需要连续两次挂载:第一个是将主机上的目录挂载到系统中,第二个是将boot2docker上的新目录挂载到容器中,像这样:

    1. Mount local system on boot2docker:

       sudo mount -t vboxsf hostfolder /boot2dockerfolder
      
    2. Mount boot2docker file on a Linux container

       docker run -v /boot2dockerfolder:/root/containerfolder -i -t imagename
      
    当你在容器文件夹内执行ls命令时,你将看到主机文件夹的内容。

    0

    2021年7月更新

    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>
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接