docker挂载悬挂卷
我最近在windows上创build了一个在boot2docker上运行的mongodb docker实例。
不幸的是,在我对kitematic的实验过程中,我设法意外地从mongo容器中删除了音量,并且无法再访问我的数据。
mongo实例似乎已经创build了一个新卷,旧卷现在保持悬空(孤立),而不是挂载在任何容器中。
有什么办法可以恢复吗?
感谢您的回复,让我走上正轨,我设法使用以下命令启动一个新的mongo容器
docker run -d -v 571284fbe08a3f2b675af299ec14e55550bad623f6316914d465843fa12d6f18:/data/db mongo
其中571284fbe08a3f2b675af299ec14e55550bad623f6316914d465843fa12d6f18是通过使用确定的悬挂量
docker volume ls
在这种情况下,我通常会注册所创build的任何数据卷容器的path(在文件中)。 请参阅“ 持久化数据的Docker卷 – 是否足以仅传递容器path? ”和脚本updateDataContainerPath
。
我所看到的是:
- 任何新的数据卷容器都带有自己的
Mounts.Source
path , - 你可以删除那个新的文件夹(这是空的)
- 您可以将其replace为旧数据容器容器的文件夹(赋予它与新数据容器相同的名称,但使用旧数据容器容器的内容)
这对于新的数据卷容器来说就足以让您访问旧数据。
在你的情况下,因为你没有注册你以前的数据卷容器的path,你将不得不在/mnt/sda1/var/lib/docker/volumes/
search一个已知的文件。
这个答案可能只是重写@ VonC的,但我觉得有必要总结一下。 以下是我为了放回容器被移除和重新创build后“分离”的卷而遵循的步骤。
-
docker volume ls -f 'dangling=true'
查看所有分离的卷 -
docker volume inspect <volume_hash>
,看看它们在哪里(/var/lib/docker/volumes/
在我的情况下) - 查看每个卷的
/_data
文件夹以猜测谁是谁。 - 然后,如VonC所解释的那样,只需将悬挂量的内容复制到新的内容即可。
- (可选)当你确定你已经找回所有你需要的东西的时候,
docker volume prune
会删除所有悬挂的卷(这样就可以更容易地find正确的悬挂卷)^^)