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

6
假设我删除了一个 PostgreSQL 的 Docker 容器,容器中的数据仅存储在以下位置:
$ docker inspect postgres1
...
"Source": "/var/lib/docker/volumes/4948af..../_data"
"Destination": "/var/lib/postgresql/data"

$ docker rm postgres1

如果没有其他容器引用该卷,即使文件仍然存在于/var/lib/docker/volumes/...中,我也无法再使用--volumes-from重新连接到该卷。
这给我带来了两个问题:
1. 如果我不知道目录的卷UUID,最好的方法是什么?
- 使用ls /var/lib/docker/volumes/命令会显示一百个类似f77c92...的目录。 - 使用find . -name "*postgres*"命令仍然会得到像...10e0dc/_data/postgresql.conf这样的几十个结果,并且没有明确的方法来识别正确的结果。
2. 找到目录中的正确数据后,如何将新创建的postgres容器重新连接到/var/lib/docker/volumes/4948af.../_data中的数据?
我每天进行完整系统rsync备份。在恢复方面,它能提供哪些帮助(除了恢复整个系统)?
1个回答

5
这就是为什么在创建数据容器时,我总是将其路径注册到文件中的原因。 (请参见我的脚本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}是注册或保存数据容器卷路径的文件。

如果已经为该数据容器保存了路径,那么该脚本将会删除空的数据容器文件夹,并将旧的文件夹移动到新的位置(并更新新的路径)。

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

这将有助于回答您的第二个问题,并完全避免您的第一个问题。

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


这是一个很好的方法,因为它提供了数据路径的备份。自动化的解决方案会更好,这样注册路径就不会被遗忘。当尝试运行脚本时,它只会保存多卷数据容器中第一个卷的路径。我可以从保存的路径导入数据到新容器中,但是当我重新创建容器时,我该如何实际“重新连接”到路径呢? - ChrisW
@ChrisW 是的,我的脚本目前只关心第一个卷。重新连接是我的答案的最后一部分,在 https://github.com/VonC/b2d/blob/bb0a9afb4195da083e77157d54cb626d1b9eaa1d/updateDataContainerPath#L35-L38 完成。 - VonC
好的,我明白了,那应该可以行得通!我会用一些测试容器试试看。谢谢你的解释。 - ChrisW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接