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