【问题标题】:Mounting directory from host machine to container in Docker在 Docker 中将目录从主机安装到容器
【发布时间】:2013-03-19 13:24:48
【问题描述】:

如何将目录从主机挂载到 Docker 中的容器?

【问题讨论】:

    标签: dotcloud docker


    【解决方案1】:

    作为最终更新,该功能现已在 Docker 中发布(尽管 API 在@imiric 链接的拉取请求后发生了变化)。

    只需使用类似的命令

    docker run -v /tmp:/root myImage
    

    为了将主机上的/tmp 挂载为映像中的/root

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

    【讨论】:

    • 问:对这些路径中的任何文件的更改是否会双向起作用?
    • @AlixAxel 是的,他们会的。目录和文件位于挂载到容器的主机上。您可以从任一侧编辑文件并立即查看两者的更改。我使用它来将动态内容引入容器而不会使它们膨胀。
    • 请注意,这在 OS-X(可能还有 Windows)上无法正常工作,因为 Docker 使用从 ramdisk 运行的 VirtualBox 映像作为主机,因此该命令在图像中的 VB 主机。
    • 这绝对不适用于使用 boot2docker 的 OSX。
    • 1.3 开始,这部分适用于使用 boot2docker 的 OS X。它适用于 /Users 目录中的挂载。
    【解决方案2】:

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

    您无法根据设计安装它们,因为 Docker 无法再保证可重复的执行环境。

    但是你可以:

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

      tar -C / -c . | docker import - entend/custombase
      
    2. 导入引导根文件系统,例如运行“debootstrap”的结果。 (请注意,这是官方“基础”镜像的创建方式,因此您最好只运行“docker pull base”)

      debootstrap precise ./bootstrap
      tar -C ./bootstrap -c . | docker import - entend/ubuntubase
      
    3. 运行时将本地目录的内容注入到容器中。

      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。

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

    【讨论】:

    • #3 的语法似乎发生了变化; -i 标志需要在镜像之前,否则 docker run 会尝试找到名为 -i 的镜像。
    • 在做方法#3时,我怎样才能得到$CMD的输出?似乎 -i 选项抑制来自docker run 的输出。
    • 作为更新,这现在是 docker 中的一流选项,通过 docker run 中的 -v 选项。更多信息如下。
    • 将接受的答案更改为提及新的-v 命令行开关的答案可能是个好主意
    【解决方案3】:

    只是为了更新这个问题,这很快就会在 Docker 中成为可能。

    This pull request已经实际实现了这个功能,很快会合并到master。

    如果你安装this fork,你现在就可以使用它。

    【讨论】:

      【解决方案4】:

      在 Docker 中是可能的:

      将数据挂载到应用容器中:

      docker run -t -i -rm -volumes-from DATA -name client1 ubuntu bash
      

      【讨论】:

        【解决方案5】:

        适用于 OS X 和 Windows 的技巧

        两个连续的挂载:我猜这里的很多帖子可能使用了两个 boot2docker。您看不到任何内容的原因是因为您正在从 boot2docker 安装目录,而不是从主机安装目录。您基本上需要两个连续的挂载:第一个将目录从您的主机挂载到您的系统,第二个将新目录从 boot2docker 挂载到您的容器,如下所示:

        1. 在 boot2docker 上挂载本地系统:

           sudo mount -t vboxsf hostfolder /boot2dockerfolder
          
        2. 在 Linux 容器上挂载 boot2docker 文件

           docker run -v /boot2dockerfolder:/root/containerfolder -i -t imagename
          

        然后当您在容器文件夹中执行ls 时,您将看到主机文件夹的内容

        【讨论】:

          【解决方案6】:

          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>
          

          【讨论】:

            猜你喜欢
            • 2018-08-29
            • 1970-01-01
            • 2019-07-08
            • 1970-01-01
            • 1970-01-01
            • 2021-04-03
            • 1970-01-01
            • 1970-01-01
            • 2016-11-10
            相关资源
            最近更新 更多