在docker容器中保留数据文件

时间:2016-01-06 13:03:12

标签: docker boot2docker

这应该不难,但我无法弄清楚。我有一个容器在运行并在docker run命令中使用-v /tester。然后我做docker exec ti containername /bin/bash。然后,我使用vi /tester/stayhere.txt创建一个名为/tester/stayhere.txt的文件。然后我保存文件并验证它在那里。然后我做一个docker commit并启动新图像并且缺少stayhere.txt。我做错了什么?

2 个答案:

答案 0 :(得分:1)

使用-v在Docker容器中装入卷时,它不被视为容器本身的一部分。这就是为什么当你提交更改时它就会丢失。

根据Docker文件:

  

数据卷是一个或多个容器中专门指定的目录,绕过Union文件系统。

  

创建容器时初始化卷。如果容器的基本映像包含指定安装点的数据,则在卷初始化时将现有数据复制到新卷中。

这意味着,数据卷存在于 Union Filesystem 之外,如果您甚至删除该容器数据量仍然存在:

  

数据卷旨在保留数据,与容器的生命周期无关。因此,当您删除容器时,Docker永远不会自动删除卷,也不会“垃圾收集”容器不再引用的卷。

因此它们不是您的docker commit命令的一部分。

为了实现您的目标,您需要在图像中的同一路径中复制文件,而未安装作为docker volume。您可以使用Dockerfile或直接启动容器并更改文件系统然后提交。

下次启动容器时,您应该可以看到这些文件。

答案 1 :(得分:0)

我不能说,没有你正在运行的命令。我猜测你并没有真正开始新的'某种方式的图像。我认为那是因为你已经开始"它与docker exec(在正在运行的容器中启动)而不是docker run

但更普遍的是,我认为改变和提交是不好的做法。你真正应该做的是构建你的东西​​的任何东西,你应该在构建时做(使用Dockerfile)。

任何持久状态,您应该通过卷装或存储容器装入容器。

创建其中之一非常容易:

docker create -v /path/to/data --name my_storage_container base-image-name /bin/true

然后从干净的构建映像启动容器:

docker run -it --volumes-from my_storage_container image /bin/bash

您保存的文件应该保留,无论您对图像有多乱。