考虑一个声明了两个卷的 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
存档中,并在需要时使用它。