如何在Docker镜像中“取消声明”卷?

14

我正在编写一个Dockerfile,用于设置测试Web应用程序的镜像。我基于tutum/lamp镜像(https://github.com/tutumcloud/tutum-docker-lamp/blob/master/Dockerfile)进行构建,因为它似乎是一个很好的起点。

作为dockerfile的一部分,我想创建一个mysql数据库并在其中设置一些内容。然而,tutum/lamp镜像声明了VOLUME ["/etc/mysql", "/var/lib/mysql" ],因此如果我理解正确,在Dockerfile中所做的任何对MySQL数据库的更改都不会被持久保存。

  • 我的理解正确吗?

如果是的话,

  • 是否有一种方法可以“取消声明”这些卷,使得这些目录成为联合文件系统的一部分,就像其他所有内容一样?

谢谢!


1
我其实也在尝试做同样的事情。我已经从tutum/lamp中删除了卷,但是当我尝试构建它时,出现了以下错误:start-apache2.sh: 没有那个文件或目录 - pguardiario
@pguardiario:你是否克隆了tutum/lamp git目录中的所有文件?你需要获取所有支持文件,而不仅仅是Dockerfile。此外,请确保在正确的目录中运行“docker build”。 - Mikkel
是的,我也弄明白了。我已经让它们都构建成功了,但是我仍然在移动容器方面遇到问题。 - pguardiario
3个回答

6

您不能真正取消声明卷,但可以通过修改其dockerfile构建原始映像的自定义版本。


有没有办法从现有的Docker Hub镜像中获取Docker文件? - nsn

3

无法更改现有容器,因此您有两个选择:

  1. 使用Tutum容器构建自己的变体
  2. 使用数据容器管理tutum容器的持久性。

数据容器

创建一个容器,创建数据卷引用:

docker run -it --name dbvol -v /var/lib/mysql ubuntu env

这可以被用于运行mysql数据库以持久化数据:
docker run -d --volumes-from dbvol -p 3306:3306 tutum/mysql:5.6

数据将持续存在只要"dbvol"容器存在。它可以在任何阶段删除:
docker rm dbvol

Reference:


谢谢您的回复。我知道“数据容器”原则,但我不知道如何将其与Dockerfile脚本结合使用?我想在脚本中创建一个数据库,并对其进行多个添加和更改。 - Mikkel
3
那么就使用Tutum使用的dockerfile在本地运行来创建自己的镜像。从性能角度来看,使用本地卷存储数据也更加高效(因为Aufs很慢)。数据容器模式只是一个有用的技巧,可以确保数据卷不会随着容器的删除而被删除(只有当所有容器引用都不存在时才会删除卷)。 - Mark O'Connor
我自己也得出了这个结论(构建自己的类似tutum的镜像)。我只是想知道是否有一种方法可以“取消声明”一个卷。如果您将构建自己的镜像的建议发布为答案,我将标记它为正确答案。 - Mikkel

0

这个问题领域多年来一直没有改变,因此我创建了docker-copyedit作为一种解决方法,通过编辑已下载镜像的元数据来“取消声明”一个卷。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接