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

标签 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...
    • 使用查找。 -name "*postgres*" 我仍然得到很多这样的结果 ...10e0dc/_data/postgresql.conf,没有明确的方法来识别正确的结果。
  2. 一旦我在目录中找到正确的数据,我如何重新连接一个新创建的 postgres 容器到 /var/lib/docker/volumes/4948af.../中的这个数据_数据

我每天都有一个完整的系统 rsync 备份。这对恢复有何帮助(除了恢复整个系统)?

最佳答案

这就是为什么在创建数据容器时,我总是在文件中注册它的路径。 (看我的脚本 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 选项),而且我知道下次我重新创建同一个数据容器时,我会找回我的数据。

关于database - 如何从已删除的 Docker 容器中恢复数据?如何将其重新连接到数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33163864/

相关文章:

postgresql - 如何将文本文件插入 PostgreSQL 中的字段?

docker - Visual Studio Code Remote - 容器 - 更改外壳

java - 约 10 秒后与 Airflow docker 容器断开连接

java - H2 是否为每个远程连接生成一个新线程?那么,有限制吗?

c# - 此平台不支持 LocalDB

mysql - Magento 2 在模块中创建多数据库表

c# - 删除插入时的非唯一数据

postgresql - 错误 42883 : operator does not exist: text/text

sql - Postgres - 按顺序跨月进行队列分析,而不是在任何以后的月份中存在

docker - 在存储库 docker.io/library/golang 中找不到标签 1.10.3 AS base