Docker挂机悬挂音量

时间:2015-11-26 02:37:15

标签: docker

我最近在windows上创建了一个运行在boot2docker上的mongodb docker实例。

不幸的是,在我尝试使用kitematic时,我设法意外地从mongo容器中删除了卷,无法再访问我的数据。

mongo实例似乎创建了一个新卷,旧卷现在仍然悬空(孤立)并且没有安装在任何容器中。

有什么方法可以恢复吗?

3 个答案:

答案 0 :(得分:7)

感谢您的回复让我走上正轨,我设法使用以下命令启动了一个新的mongo容器

docker run -d -v 571284fbe08a3f2b675af299ec14e55550bad623f6316914d465843fa12d6f18:/data/db mongo

其中 571284fbe08a3f2b675af299ec14e55550bad623f6316914d465843fa12d6f18 是使用

识别的悬空卷
docker volume ls

答案 1 :(得分:5)

我通常会注册我创建的任何数据卷容器的路径(在文件中),正是在这种情况下。请参阅“Docker volumes for persistent data - is it enough to pass container path only?”和我的脚本updateDataContainerPath

我所看到的是:

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

在您的情况下,由于您没有注册先前数据卷容器的路径,因此您必须在/mnt/sda1/var/lib/docker/volumes/中搜索已知文件。

答案 2 :(得分:5)

这个答案可能只是@VonC的改写,但我觉得有必要总结一下。以下是我在删除容器并重新创建容器后放回“已分离”的卷所遵循的步骤。

  1. docker volume ls -f 'dangling=true'查看所有已分离的卷
  2. 每个
  3. docker volume inspect <volume_hash>看看他们坐在哪里(/var/lib/docker/volumes/在我的情况下)
  4. 查看每个卷的/_data文件夹,猜猜谁是谁。
  5. 然后正如VonC所解释的那样,只需将悬空卷的内容复制到新的内容中即可。
  6. (可选)当您确定已收回所需的所有内容时,docker volume prune将删除所有悬空卷(因此可能会更有可能在未来搜索正确的悬空卷^^)