这应该不难,但我想不通。我运行了一个容器,并在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
然后保存的文件应该保持不变,无论你对图像做了多少改动。