【问题标题】:Docker mount an directory of container to another containerDocker将容器的目录挂载到另一个容器
【发布时间】:2018-01-10 11:10:24
【问题描述】:

我有一个容器 Container-A,它的目录 /opt/test/data 包含在构建映像期间创建的文件。 现在我想将 /opt/test/data(container-a directory) 共享给 Container-B,因为它需要在其生命周期内使用这些文件。 我尝试了以下选项

docker run -it -d -v shareddata:/opt/test/data --name container-a test

然后将容器-B 运行为

docker run -it --volumes-from container-a --name container-b test-prod:latest

数据已共享,但它在主机上创建了一个命名卷 shareddata,其中包含 container-a 的 /opt/test/data 目录的重复数据。

我尝试了另一种创建名称卷数据并将其安装在容器-a 中的选项。然后我在已安装的卷上创建了 /opt/test/data 的符号链接,如下所示

ln -s /data/data /opt/test/data

现在将 /data 卷安装到 container-b,但符号链接在 container-b 上不起作用,因为它显示为断开的链接。

有没有一种方法可以在不复制数据的情况下将容器-a 目录共享到容器-b,因为我们希望将静态且相当大的数据保留到一个图像,大约 2.5G,然后一个实例继续运行,共享测试产品图像的多个容器?

【问题讨论】:

    标签: docker dockerfile docker-volume


    【解决方案1】:

    执行此操作的常用方法是在启动容器时创建这些文件,而不是在构建时创建。您可以先检查文件是否已创建,如果没有,则创建它们(或从 /tmp 或 wathever 移动它们)

    例如,mysql 的官方镜像就是这样做的。

    然后,您可以在该目录中挂载一个卷,并在容器之间共享它。

    【讨论】:

    • 容器-a 映像使用 rpm 来安装这些文件,因为它们是特定区域的媒体文件。所以我们不能使用这个apporch。
    【解决方案2】:

    试试这个,你可以直接从一个容器共享数据到另一个容器,而无需使用主机目录,

    $ docker run -v /opt/test/data --name container-a test
    $ docker run --volumes-from container-a test-prod:latest
    

    希望,这可以解决您的问题。由于数据量更大并且您在多个容器之间共享它,可能会选择更好的存储编排解决方案,例如 rexray,您可以在 n 个容器之间轻松共享。

    【讨论】:

    • 这个我已经尝试过了,它会在主机卷上创建重复文件。
    【解决方案3】:

    如果您作为卷挂载的容器的目录中已经存在文件,则目录的内容将被复制到卷中。见Populate a volume using a container

    如果不进行复制,就无法将容器的目录挂载为卷。另一种方法是不将数据存储在容器中,而是在主机上创建一个卷并用数据填充它。这样,数据只会存在一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-10
      • 1970-01-01
      • 2017-09-19
      • 2017-10-23
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      • 2016-11-10
      相关资源
      最近更新 更多