【问题标题】:mounting volume into docker container将卷安装到 docker 容器中
【发布时间】:2023-04-05 03:48:01
【问题描述】:

我如何将主机的路径安装到容器中而不覆盖相同安装路径中已经存在的包含。

困惑?我举个例子:

使用 WORKDIR 作为 /app 构建一个 docker 映像,并使用文件 /app/config1 烘焙它。现在,我将在主机 ~/ 的运行时添加一些配置文件,并希望这些文件在同一 /app 路径的容器中

当我做docker run -v ~/:/app example 它似乎正在删除烘焙的 config1 文件

关于如何解决这个用例的任何指示?当然,除了安装在不同的路径。

TIA!

【问题讨论】:

    标签: docker containers docker-volume


    【解决方案1】:

    Docker 正在实现 Linux 挂载系统调用来执行绑定挂载,并且始终隐藏底层文件系统,就像 Linux 中的大多数其他挂载命令一样,没有标志或选项可以更改 Linux 的行为。覆盖文件系统会将多个目录合并在一起,但您不能将覆盖文件系统指向作为覆盖文件系统的源,这样就不行了。这留下了我能想到的两个选择。

    docker 中的命名卷将在为空时使用映像文件系统的内容进行初始化,因此,如果您不担心使用旧卷中的配置使用新配置文件重建映像,则可以使用它们。如果您需要将该卷挂载回主机路径,则可以将标志传递给本地卷驱动程序以挂载与 docker 使用的默认命名卷路径不同的主机路径。以下是三种不同的方法,具体取决于您运行容器的方式:

      # create the volume in advance
      $ docker volume create --driver local \
          --opt type=none \
          --opt device=/home/user/test \
          --opt o=bind \
          test_vol
    
      # create on the fly with --mount
      $ docker run -it --rm \
        --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/home/user/test \
        foo
    
      # inside a docker-compose file
      ...
      volumes:
        bind-test:
          driver: local
          driver_opts:
            type: none
            o: bind
            device: /home/user/test
      ...
    

    否则,您可以将映像修改为入口点,以在映像构建期间将配置文件保存到缓存位置,然后在容器在入口点启动时将它们复制回目标目录。我的base image scripts 中有一个例子。与指定卷到绑定挂载相比,这具有优势,因为无论卷如何挂载,它都可以工作,并且可以更新已有内容的现有卷。

    【讨论】:

      【解决方案2】:

      Bind mounting directory from host 将覆盖该文件夹的内容。如果您只需要挂载几个配置文件,则可以为每个文件单独绑定挂载,例如-v ~/config2:/app/config2.

      另一种方法是将目录挂载到不同的位置,并向容器添加逻辑以从多个位置收集配置文件。

      【讨论】:

      • 1) 无法挂载多个文件,因为文件是在运行时创建并添加到主机路径中的。 2)安装在不同的位置不是我正在寻找的解决方案。如问题中所述。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-27
      • 2017-09-10
      • 2019-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多