【问题标题】:How to recover data from a deleted Docker container? How to reconnect it to the data?如何从已删除的 Docker 容器中恢复数据?如何重新连接到数据?
【发布时间】:2016-01-14 19:35:14
【问题描述】:

假设我删除了一个 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 备份。这对恢复有何帮助(没有恢复整个系统)?

【问题讨论】:

    标签: database postgresql docker recovery


    【解决方案1】:

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

    【讨论】:

    • 这是一个很好的方法,因为它提供了数据路径的备份。对此的自动化解决方案会很好,这样就不会忘记注册路径。在尝试您的脚本时,它只会保存多卷数据容器的第一卷的路径。 -- 我可以将数据从保存的路径导入到一个新的容器,但是当我重新创建一个容器时,我将如何真正重新连接到路径?
    • @ChrisW 是的,我的脚本现在只关心第一卷。重新连接是我回答的最后一部分,在github.com/VonC/b2d/blob/… 完成
    • 是的,我明白了,这将如何工作!我将尝试使用一些测试容器。感谢您的解释。
    猜你喜欢
    • 2021-02-26
    • 2020-10-15
    • 2021-06-02
    • 2020-03-13
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多