如何从 docker 创建包含卷数据的图像?

如何从 docker 创建包含卷数据的图像?

考虑一个声明了两个卷的 Dockerfile

FROM someimage
# ...
VOLUME ["/foo", "/bar"]

并从该镜像启动一个容器,对其中一个卷进行绑定挂载:

docker run --name mycontainer -d -v /some/path:/foo myimage

如果我使用这个容器创建了一个新图像

docker commit mycontainer myexportedimage

导出的图像中将排除两个路径/foo和。/bar

如何创建一个可运行的(即维护来自 Dockerfile 的元数据)图像,其中包含来自两个路径(绑定安装)和(Dockerfile 声明的卷)mycontainer的数据,因此如果我将图像导出到另一个 Docker 主机,所有数据都会存在?/foo/bar

答案1

免责声明:答案是不完整的,因为您将无法像询问的那样从 Dockerfile 中进行管理,并且观点是“我们不应该处于这种情况,我们不应该尝试以那种方式解决这个问题”。

我知道这是一个老问题,但我遇到了同样的情况,这就是我所做的。

您可以创建一个包含卷内容的映像,用于docker cp将卷内容本地导入容器(只需将其复制到正在运行的容器中的其他位置,并注意这会重复数据,因此请注意文件系统的使用情况)。或者将其复制exec到容器中并使用cp命令将已安装卷中的数据复制到其他位置(即tmp目录中)。

然后,您可以docker commit将该容器转换为映像。从该新映像运行新容器(不使用 docker 卷),并将复制的文件移回其应在的位置(如果卷已安装)。

现在,docker commit再次使用从复制卷内容的容器中获取可重复使用的图像。

您现在可以标记和/或将该图像推送到注册表或docker save存档中,并在需要时使用它。

相关内容