在Docker中,如何在容器之间共享文件,然后将其保存到图像中?

在Docker中,如何在容器之间共享文件,然后将其保存到图像中?,docker,data-sharing,Docker,Data Sharing,我想将容器共享卷中的数据提交到映像。我似乎做不到?我有点觉得这在Docker可能是不可能的,但这似乎与不在主机上留下数据的整个理念完全不一致,所以我认为一定有办法做到这一点 1.1号航站楼 在1号航站楼启动一个带有卷的容器 $ docker run -it -v /data ubuntu:14.10 /bin/bash root@19fead4f6a68:/# echo "Hello Docker Volumes." > /data/foo.txt 2.2号航站楼 在终端2中启动第二个容

我想将容器共享卷中的数据提交到映像。我似乎做不到?我有点觉得这在Docker可能是不可能的,但这似乎与不在主机上留下数据的整个理念完全不一致,所以我认为一定有办法做到这一点

1.1号航站楼 在1号航站楼启动一个带有卷的容器

$ docker run -it -v /data ubuntu:14.10 /bin/bash
root@19fead4f6a68:/# echo "Hello Docker Volumes." > /data/foo.txt
2.2号航站楼 在终端2中启动第二个容器。容器1中的文件在那里,因此docker卷都在工作

$ docker run -it --volumes-from 19fead4f6a68 ubuntu:14.10 /bin/bash

root@5c7cdbfc67d8:/# cat /data/foo.txt
Hello Docker Volumes.
3.3号航站楼 我的理解是,我只能将差异提交到图像,因此我检查两个容器上的差异。由于某些奇怪的原因,我的更改没有显示

$ docker diff 19fead4f6a68
A /data

$ docker diff 5c7cdbfc67d8
A /data
4.回到1号航站楼 我在卷文件夹外创建了一个文件

 root@19fead4f6a68:/# echo "Docker you are a very strange beast...." > /var/beast.txt
5.回到3号航站楼 我们现在可以提交一些更改,尽管我很沮丧,因为这不是我需要与其他容器共享的卷中的数据

$ docker diff 19fead4f6a68
A /data
C /var
A /var/beast.txt

显然,这是故意的。有人知道为什么docker不允许我将卷数据保存到commit吗?是否存在在容器之间共享文件并将其保存到图像的方法?我觉得我一定错过了什么?特别是在共享数据的同时避免主机依赖性。

卷位于容器映像之外。这正是他们的目的——将数据放入一个不在图像中的容器中

从:

数据卷是一个或多个容器内的特殊指定目录,它绕过Union文件系统,为持久或共享数据提供了几个有用的功能:

  • 数据卷可以在容器之间共享和重用
  • 直接对数据卷进行更改
  • 更新映像时,将不包括对数据卷的更改
如果要将某些更改保存为图像的一部分,请在图像内部而不是卷中进行更改。如果您想跨多个容器共享更改,请将该数据放在一个卷中,但您必须为快照、回滚等做出自己的安排,因为Docker没有该功能


也许您会感兴趣。

似乎在向docker添加卷层方面存在一个尚未解决的问题:


那么像第三个实体?我意识到它们没有被当作容器的一部分。然而,我的问题是,在装载主机卷之外,是否有可能保存第三个实体?扩展了我的答案,试图解决这个问题