boot2Persist docker容器中的数据文件



这应该不难,但我想不通。我运行了一个容器,并在docker run命令中使用了-v /tester。然后我做docker exec ti containername /bin/bash。然后,我用vi /tester/stayhere.txt创建了一个名为/tester/stayhere.txt的文件。然后我保存文件并验证它是否在那里。然后我做了一个docker提交并启动了新的映像,stayhere.txt不见了。我做错了什么?

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

根据Docker文件:

数据卷是绕过联合文件系统的一个或多个容器中的特殊指定目录。

和:

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

这意味着,数据卷位于Union Filesystem之外,即使删除了该容器数据卷,它仍然存在:

数据卷是为持久化数据而设计的,与容器的生命周期无关。因此,Docker在删除容器时永远不会自动删除卷,也不会"垃圾收集"容器不再引用的卷。

所以它们不是docker提交命令的一部分。

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

下次启动卷为的容器时,您应该能够看到这些文件。

如果没有你正在运行的确切命令,我就说不出来。我猜你实际上并没有以某种方式开始"新"的形象。我认为这是因为你用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

然后保存的文件应该保持不变,无论你对图像做了多少改动。

最新更新