如何从已删除的Docker容器中恢复数据?如何将其重新连接到数据?

时间:2015-10-16 06:27:52

标签: database postgresql docker recovery

让我们说,我删除了一个只有数据的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
  3. 中的这些数据

    我每天都有一个完整的系统rsync备份。这有什么可以帮助恢复(缺少恢复整个系统)?

1 个答案:

答案 0 :(得分: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}是您注册或保存数据容器卷路径的文件)

如果已经为该数据容器保存了一个路径<{3}}(并更新了新路径)

,该脚本将会是

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

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

这样,我可以运行任何容器(包括数据容器,当然没有-v选项),我知道下次重新创建相同的数据容器时,我会找回我的数据。 / p>