2015-10-16 2729 views
2

比方说,我删除一个PostgreSQL泊坞窗容器,只有在这里有它的数据:如何从已删除的Docker容器中恢复数据?如何重新连接到数据?

$ docker inspect postgres1 
... 
"Source": "/var/lib/docker/volumes/4948af..../_data" 
"Destination": "/var/lib/postgresql/data" 

$ docker rm postgres1 

如果没有其他容器引用量,我不能重新连接到这个体积--volumes-from更多,即使文件仍然在磁盘上某处:/var/lib/docker/volumes/...

这带来了我两个问题:

  1. 什么是定位数据的最好的方式,如果我不知道目录的卷UUID?
    • ls /var/lib/docker/volumes/向我展示了这样一百个像这样f77c92...
    • 使用find . -name "*postgres*"我仍然得到了许多像这样的结果... 10e0dc/_data/postgresql.conf,没有明确的方法来确定正确的。
  2. 有一次,我在名录中寻找正确的数据,我怎么重新一个新创建的Postgres的容器,这个数据在/var/lib/docker/volumes/4948af.../_data

我有一个每日完整系统Rsync备份。这对恢复有什么帮助(恢复整个系统的情况不大)?

回答

2

这正是创建数据容器时,我总是在文件中注册其路径的原因。 (见我的脚本updateDataContainerPath

使用(只创建一个数据容器后使用):

docker inspect ${gitolite_repos_cont} > /dev/null 2>&1 || docker create --name="${gitolite_repos_cont}" gitolite.repos /bin/true 

# source the script, to make the updatePath() function available 
. ../updateDataContainerPath 

# save the path in a file 
updatePath ${gitolite_repos_cont} "$HOME/b2d/gitolite" ${grepos} 

(这里${grepos}是您注册或保存数据容器的体积的路径的文件)

该脚本会,如果有已经保存的数据容器,remove the empty data container folder, and move the old one to the new one路径(和更新新的路径)

sudo rm -Rf "${grpath}" 
sudo mv "${fgrpath}" "${grpath}" 

这将有助于回答你的问题2,并且完全避免你的问题1.

这样的话,我可以RM任何容器(包括数据容器,而-v选项当然),我知道下一次我重新创建相同的数据容器,我会找回我的数据。

+0

这是一种很好的方法,因为它提供了数据路径的备份。对此的自动化解决方案会很好,所以注册路径不会被忘记。在尝试脚本时,它只会保存多卷数据容器的第一个卷的路径。 - 我可以将保存的路径中的数据导入到一个新的容器中,但是当我重新创建容器时,我将如何实际重新连接到路径? – ChrisW

+0

@ChrisW是的,我的脚本现在只关心第一卷。重新连接是我的答案的最后一部分,在https://github.com/VonC/b2d/blob/bb0a9afb4195da083e77157d54cb626d1b9eaa1d/updateDataContainerPath#L35-L38 – VonC

+0

完成,对,我明白了,这将如何工作!我会用一些测试容器来尝试一下。感谢您的解释。 – ChrisW

相关问题