我试图捕获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目录中。
我的问题是,是否有一种方法可以从容器中创建镜像,允许镜像在其卷中包含文件内容。
发布于 2017-03-27 15:03:34
通过将更改放入卷中,您可以将它们从实际的容器中排除。docker export的文档包括以下内容:
docker导出命令不会导出与容器关联的卷的内容。如果卷安装在容器中现有目录的顶部,docker export将导出底层目录的内容,而不是卷的内容。
有关在卷中导出数据的示例,请参阅用户指南中的备份、还原或迁移数据卷。
这指向this documentation。请按照此处的步骤导出存储在卷中的信息。
你可能正在寻找类似这样的东西:
docker run --rm --volumes-from <containerId> -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /cookbook这将使用容器的/cookbook目录的内容创建一个backup.tar文件,并将其存储在主机的当前目录中。然后您可以使用此tar文件将其导入到另一个容器中。
发布于 2017-03-27 16:28:32
是否有一种方法可以从容器中创建镜像,从而允许镜像在其卷中包含文件内容?
不,因为卷是为管理Docker容器内部和之间的数据而设计的,所以它用于持久化和共享数据。图像中的内容通常是您的程序(工件、可执行文件、库。例如,在整个环境中,构建/更新数据到映像没有多大意义。
在docs of volumes,他们告诉我们:
更新映像时,不会包括对数据卷所做的
发布于 2017-03-27 15:07:49
本质上,在Docker中有三种实现持久性的方法:
/cookbook目录是卷的一部分,所以您的文件不会与映像一起提交/导出。但是,它会存储在卷中,所以如果您在不同的容器中重新挂载相同的卷,您会在那里找到您的文件。您可以使用docker volume ls列出您的卷。正如您所看到的,如果您计划重用卷名,您可能应该给出卷名。您可以使用以下命令挂载现有卷,或者在名称不存在的情况下创建新卷docker run -v name:/directory ubuntu
-v标志,那么您的文件就会出现在commit中。
-v /hostdir:/targetdir语法,将一个目录从主机绑定挂载到容器。然后,容器只需访问主机的目录。https://stackoverflow.com/questions/43038467
复制相似问题