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.Sourcepath ,
  • 你可以删除那个新的文件夹(这是空的)
  • 您可以将其replace为旧数据容器容器的文件夹(赋予它与新数据容器相同的名称,但使用旧数据容器容器的内容)

这对于新的数据卷容器来说就足以让您访问旧数据。

在你的情况下,因为你没有注册你以前的数据卷容器的path,你将不得不在/mnt/sda1/var/lib/docker/volumes/search一个已知的文件。

这个答案可能只是重写@ VonC的,但我觉得有必要总结一下。 以下是我为了放回容器被移除和重新创build后“分离”的卷而遵循的步骤。

  1. docker volume ls -f 'dangling=true'查看所有分离的卷
  2. docker volume inspect <volume_hash> ,看看它们在哪里( /var/lib/docker/volumes/在我的情况下)
  3. 查看每个卷的/_data文件夹以猜测谁是谁。
  4. 然后,如VonC所解释的那样,只需将悬挂量的内容复制到新的内容即可。
  5. (可选)当你确定你已经找回所有你需要的东西的时候, docker volume prune会删除所有悬挂的卷(这样就可以更容易地find正确的悬挂卷)^^)