如何从已删除的 Docker 容器中恢复数据?如何将其重新连接到数据?
How to recover data from a deleted Docker container? How to reconnect it to the data?
比方说,我删除了一个 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/...
这给我带来了两个问题:
- 如果我不知道目录的卷 UUID,查找数据的最佳方法是什么?
- 做
ls /var/lib/docker/volumes/
给我一百个这样的目录 f77c92...
。
- 使用
find . -name "*postgres*"
我仍然得到很多这样的结果...10e0dc/_data/postgresql.conf,没有明确的方法来识别正确的结果。
- 一旦我在目录中找到正确的数据,我如何重新连接一个新创建的 postgres 容器到
/var/lib/docker/volumes/4948af.../_data
中的这个数据
我每天都有一个完整的系统 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
选项),而且我知道下次我重新创建同一个数据容器时,我会找回我的数据.
比方说,我删除了一个 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/...
这给我带来了两个问题:
- 如果我不知道目录的卷 UUID,查找数据的最佳方法是什么?
- 做
ls /var/lib/docker/volumes/
给我一百个这样的目录f77c92...
。 - 使用
find . -name "*postgres*"
我仍然得到很多这样的结果...10e0dc/_data/postgresql.conf,没有明确的方法来识别正确的结果。
- 做
- 一旦我在目录中找到正确的数据,我如何重新连接一个新创建的 postgres 容器到
/var/lib/docker/volumes/4948af.../_data
中的这个数据
我每天都有一个完整的系统 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
选项),而且我知道下次我重新创建同一个数据容器时,我会找回我的数据.