按照Managing Data in Containers官方指南中的示例,假设有一个仅通过数据创建的容器
docker create -v /data --name data-container image /bin/true
还假设至少有一个正在运行的消费者容器,使用在仅数据容器中创建的卷:
docker run -d --volumes-from data-container --name consumer-container image
现在考虑在消费者仍在运行时使用-v
开关删除数据容器:
docker rm -v data-container
我理解the docs说这不会影响消费者容器,因为该卷实际上仍然可用:
"要从磁盘中删除卷,必须显式调用docker rm -v 反对引用该卷的最后一个容器。"
因此,这与unlink()
系统调用相当。数据量仍然可用,在"待定"州。随着"待定"我的意思是只需使用--volumes-from
就不能再将这个精确的卷绑定到其他容器了。就unlink()
类比而言,没有任何名称可以访问数据。
我的问题是:有没有办法根据这个待处理的卷重新创建一个仅限数据的容器,以便可以通过--volumes-from
再次包含它?或者是这样的"待定"卷被谴责,从某种意义上说,一旦最后一个消费者停止数据将会消失?
答案 0 :(得分:2)
可以使用docker inspect --format="{{.Volumes}}" <Container ID>
确定基础主机上卷的位置。
虽然使用者容器仍在运行,但您可以在主机上将卷的内容复制到另一个位置,并根据该新位置的内容创建一个新的数据容器。
缺点是在复制结束和停止使用者容器之间的时间内可能会对原始卷写入进一步的更改(这会导致删除原始卷)。
然而,这并不理想,但这是我可以看到这种可能的一种方式。