首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker卷内容不持久

Docker卷内容不持久
EN

Stack Overflow用户
提问于 2017-03-27 13:21:06
回答 4查看 1.3K关注 0票数 3

我试图捕获docker容器的状态作为图像,以一种包括我已添加到容器内的卷的文件的方式。因此,如果我以这种方式运行原始容器:

代码语言:javascript
复制
$ docker run -ti -v /cookbook ubuntu:14.04 /bin/bash
root@b78f3599d936:/# cd cookbook
root@b78f3599d936:/cookbook# touch foo.txt

现在,如果我将容器作为新的docker镜像导出或提交,然后从新的镜像运行容器,那么文件foo.txt永远不会包含在/cookbook目录中。

我的问题是,是否有一种方法可以从容器中创建镜像,允许镜像在其卷中包含文件内容。

EN

回答 4

Stack Overflow用户

发布于 2017-03-27 15:03:34

通过将更改放入卷中,您可以将它们从实际的容器中排除。docker export的文档包括以下内容:

docker导出命令不会导出与容器关联的卷的内容。如果卷安装在容器中现有目录的顶部,docker export将导出底层目录的内容,而不是卷的内容。

有关在卷中导出数据的示例,请参阅用户指南中的备份、还原或迁移数据卷。

这指向this documentation。请按照此处的步骤导出存储在卷中的信息。

你可能正在寻找类似这样的东西:

代码语言:javascript
复制
docker run --rm --volumes-from <containerId> -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /cookbook

这将使用容器的/cookbook目录的内容创建一个backup.tar文件,并将其存储在主机的当前目录中。然后您可以使用此tar文件将其导入到另一个容器中。

票数 2
EN

Stack Overflow用户

发布于 2017-03-27 16:28:32

是否有一种方法可以从容器中创建镜像,从而允许镜像在其卷中包含文件内容?

不,因为卷是为管理Docker容器内部和之间的数据而设计的,所以它用于持久化和共享数据。图像中的内容通常是您的程序(工件、可执行文件、库。例如,在整个环境中,构建/更新数据到映像没有多大意义。

docs of volumes,他们告诉我们:

更新映像时,不会包括对数据卷所做的

  • 更改。

也是在docs of docker commit

  • 提交操作将不包括装载在容器内的卷中包含的任何数据。
票数 2
EN

Stack Overflow用户

发布于 2017-03-27 15:07:49

本质上,在Docker中有三种实现持久性的方法:

  1. 您可以将文件保存在一个卷中,这是一个由Docker管理的文件系统。在您的示例中会发生这样的情况:因为/cookbook目录是卷的一部分,所以您的文件不会与映像一起提交/导出。但是,它会存储在卷中,所以如果您在不同的容器中重新挂载相同的卷,您会在那里找到您的文件。您可以使用docker volume ls列出您的卷。正如您所看到的,如果您计划重用卷名,您可能应该给出卷名。您可以使用以下命令挂载现有卷,或者在名称不存在的情况下创建新卷

docker run -v name:/directory ubuntu

  • You可以将文件保存为图像的一部分。如果提交容器,则对其文件层次结构所做的所有更改都将存储在新映像中,但对已挂载卷所做的更改除外。因此,如果您只是去掉了-v标志,那么您的文件就会出现在commit中。

  • 您可以使用-v /hostdir:/targetdir语法,将一个目录从主机绑定挂载到容器。然后,容器只需访问主机的目录。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43038467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档