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

时间:2014-12-11 11:03:55

标签: 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中启动第二个容器,容器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不允许我将卷数据保存到提交?无论如何都要在容器之间共享文件然后将它们保存到图像中?我觉得必须有一些我想念的东西?特别是在共享数据的同时避免主机依赖。

2 个答案:

答案 0 :(得分:6)

卷不在容器映像中。这正是它们的用途 - 将数据放入不在图像中的容器中。

来自Docker docs

  

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

     
      
  • 可以在容器之间共享和重用数据卷
  •   
  • 直接对数据卷进行更改
  •   
  • 更新图片时不会包含对数据卷的更改
  •   

如果要将某些更改保存为图像的一部分,请在图像内而不是在卷中进行更改。如果要跨多个容器共享更改,请将该数据放入卷中,但您必须自己安排快照,回滚等,因为Docker没有该功能。

也许你会对Flocker感兴趣。

答案 1 :(得分:1)

看起来有一个关于向docker添加卷层的问题:

https://github.com/docker/docker/issues/9382