如何使用挂载在主机和容器之间共享数据

时间:2018-05-31 23:22:14

标签: docker docker-compose

我一直试图在我的主机和容器之间共享数据。我一直在阅读很多关于数量的内容,我相信我误解了一些关于共享数据的基本原理。

以下是我一直在做的事情(使用Docker Compose)

version: "2"
services:
  my-server:
    volumes:
      - type: bind
        source: ./test/
        target: /var/logs

此方法的问题在于,挂载的初始创建会破坏目标文件夹中的所有数据。因此,例如,如果我的图像是从另一个在该文件夹中有一些日志的图像(无论出于何种原因)构建的,那么日志就会被破坏。

这是我的用例的主要问题。我需要安装一个卷(基本上是一个文件夹),以便我可以在主机和guest虚拟机之间共享数据,类似于VM的共享文件夹的工作方式。

我查看了命名卷,但据我所知,命名和匿名卷旨在在容器之间共享数据,而不是与主机共享数据(这是我的用例所需)。

除了绑定挂载之外,是否可以在主机和容器之间共享数据?

1 个答案:

答案 0 :(得分:1)

这不是Docker的问题。我想你会遇到任何装载。基本上,您已经在使用正确的机制在主机和容器之间共享数据。

当您在linux中挂载某些内容时,挂载目标(即挂载内容的路径)始终会替换为您挂载的内容的根目录。 将挂载目标的内容与(在本例中)绑定挂载目录的内容合并。我对使用VM共享文件夹感到惊讶,因为您遇到了很高的冲突风险。例如两个位置都有相同的文件。怎么解决这个问题?文件系统安装与两个位置之间的文件同步等保管箱不同。

我建议您将绑定装载到容器中没有内容的其他位置,然后修改容器内工作流以处理此问题。在您的示例中,听起来您正在尝试收集日志。这听起来像容器配置的日志目录可能有一些您想要复制到主机的内容。您可以通过在启动服务/运行任何内容之前配置新的日志目录并将任何现有日志复制到该位置来使容器初始化自己来实现此目的。这个新位置将是绑定挂载。您的init脚本还可以检测绑定装载是否已经以这种方式使用,而不是同步数据。这实际上是一个特定于应用程序的问题。