Docker卷内容不会持久
我试图捕获一个docker容器的状态作为一个图像,包括我已经添加到容器内的卷的文件的方式。 所以,如果我以这种方式运行原始容器:
$ docker run -ti -v /cookbook ubuntu:14.04 /bin/bash root@b78f3599d936:/# cd cookbook root@b78f3599d936:/cookbook# touch foo.txt
现在,如果我导出或者提交容器作为一个新的docker镜像,然后从新镜像运行一个容器,那么文件foo.txt永远不会被包含在/ cookbook目录中。
我的问题是,是否有方法从容器中创build图像,使图像能够在其卷中包含文件内容。
那么,通过将更改放在一个卷中,您将它们从实际容器中排除。 docker导出的文档包括:
docker export命令不会导出与容器关联的卷的内容。 如果将卷安装在容器中的现有目录之上,则docker export将导出基础目录的内容,而不是卷的内容。
有关在卷中导出数据的示例,请参阅用户指南中的“备份,还原或迁移数据卷”。
这指向这个文档 。 请按照那里的步骤导出存储在卷中的信息。
你可能正在寻找这样的东西:
docker run --rm --volumes-from <containerId> -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /cookbook
这将创build一个文件backup.tar
与容器的/cookbook
目录的内容,并将其存储在主机的当前目录。 然后,您可以使用此tar文件将其导入另一个容器中。
是否有方法从容器中创build图像,使图像能够在其卷中包含文件内容?
不,因为卷的目的是pipe理你的Docker容器内部和之间的数据,所以它被用来保存和共享数据。 图像中的内容通常是你的程序(工件,可执行文件,库文件),在整个环境中,build立/更新数据到图像没有什么意义。
在文档中 ,他们告诉我们:
- 更新图像时,不会包含对数据量的更改。
另外在docker commit文档中 :
- 提交操作将不包含容器内安装的卷中包含的任何数据。
从本质上讲,有三种方法可以在Docker中进行持久化:
-
您可以将文件保存在一个由Dockerpipe理的文件系统的卷中。 这是你的例子中发生的事情:因为
/cookbook
目录是一个卷的一部分,你的文件不会被提交/导出的图像。 但是,它确实存储在卷中,因此如果您在不同的容器中重新装入相同的卷,则会在该卷中find您的文件。 您可以使用docker volume ls
列出您的卷。 正如你所看到的,如果你打算重用它们,你应该给你的卷名称。 您可以挂载现有的卷,或者创build一个新的卷(如果名称不存在)docker run -v name:/directory ubuntu
-
您可以将文件保留为图像的一部分。 如果您提交了容器,则对其文件层次结构的所有更改都将存储在新映像中, 除了对已装入卷进行的更改。 所以,如果你只是摆脱
-v
标志,你的文件显示在提交。 -
您可以使用
-v /hostdir:/targetdir
语法将主机上的目录绑定到容器。 容器然后只需访问主机的目录。
Docker提交允许你从一个容器和它的数据创build一个图像(挂载的卷将被忽略)