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中进行持久化:

  1. 您可以将文件保存在一个由Dockerpipe理的文件系统的卷中。 这是你的例子中发生的事情:因为/cookbook目录是一个卷的一部分,你的文件不会被提交/导出的图像。 但是,它确实存储在卷中,因此如果您在不同的容器中重新装入相同的卷,则会在该卷中find您的文件。 您可以使用docker volume ls列出您的卷。 正如你所看到的,如果你打算重用它们,你应该给你的卷名称。 您可以挂载现有的卷,或者创build一个新的卷(如果名称不存在)

    docker run -v name:/directory ubuntu

  2. 您可以将文件保留为图像的一部分。 如果您提交了容器,则对其文件层次结构的所有更改都将存储在新映像中, 除了对已装入卷进行的更改。 所以,如果你只是摆脱-v标志,你的文件显示在提交。

  3. 您可以使用-v /hostdir:/targetdir语法将主机上的目录绑定到容器。 容器然后只需访问主机的目录。

Docker提交允许你从一个容器和它的数据创build一个图像(挂载的卷将被忽略)