将体积装入 docker 容器

mounting volume into docker container

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

迷茫?让我举个例子:

使用 WORKDIR 作为 /app 构建了一个 docker 图像,并用文件 [= 烘焙了它28=]/app/config1。现在,我将在运行时在主机 ~/ 上添加一些配置文件,并希望这些文件位于相同的容器中 /app path

当我这样做时 docker run -v ~/:/app example 好像是删除烘焙好的config1文件

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

TIA!

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

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

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 中有一个这样的例子。与命名卷相比,绑定挂载的优势在于无论卷是如何安装的,它都可以工作,并且可以更新已有内容的现有卷。