我试图将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目录中。
我的问题是,是否有办法以允许图像在其卷中包含文件内容的方式从容器创建图像。
答案 0 :(得分:2)
好吧,通过将更改放入卷中,您将它们从实际容器中排除。 docker export的文档包括:
docker export命令不会导出与容器关联的卷的内容。如果卷安装在容器中现有目录的顶部,则docker export将导出基础目录的内容,而不是卷的内容。
有关导出卷中数据的示例,请参阅用户指南中的备份,还原或迁移数据卷。
这指向this documentation。请按照那里的步骤导出存储在卷中的信息。
你可能正在寻找这样的东西:
docker run --rm --volumes-from <containerId> -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /cookbook
这将创建一个文件backup.tar
,其中包含容器/cookbook
目录的内容,并将其存储在主机的当前目录中。然后,您可以使用此tar文件将其导入另一个容器中。
答案 1 :(得分:1)
是否有办法以允许图像在其卷中包含文件内容的方式从容器创建图像?
不,因为卷旨在管理Docker容器内部和之间的数据,所以它用于持久化和共享数据。图像中的内容通常是您的程序(工件,可执行文件,库,例如)及其整个环境,构建/更新数据到图像没有多大意义。
在docs of volumes,他们告诉我们:
- 更新图像时,不会包含对数据卷的更改。
- 提交操作不包括容器内安装的卷中包含的任何数据。
答案 2 :(得分:0)
基本上,在Docker中有三种方法可以执行持久性:
您可以将文件保存在卷中,该卷是由Docker管理的文件系统。这是您的示例中发生的情况:因为/cookbook
目录是卷的一部分,所以您的文件不会与图像一起提交/导出。然而它确实存储在卷中,因此如果您在不同的容器中重新安装相同的卷,您将在那里找到您的文件。您可以使用docker volume ls
列出您的卷。如您所见,如果您打算重用它们,则应该提供卷名。您可以装载现有卷,或者如果名称不存在,则使用
docker run -v name:/directory ubuntu
您可以将文件保留为图像的一部分。如果提交容器,则对其文件层次结构的所有更改都将存储在新映像中,但对已装入的卷进行更改。因此,如果您只是删除-v
标志,则您的文件会显示在提交中。
您可以使用-v /hostdir:/targetdir
语法将主机上的目录挂载到容器。然后,容器只能访问主机的目录。
答案 3 :(得分:0)
Docker commit允许您从容器创建图像及其数据(将忽略已安装的卷)