如何备份和恢复 MongoDB Dev Container 的持久化数据卷
2026/9/12 3:08:37 网站建设 项目流程

如何备份和恢复 MongoDB Dev Container 的持久化数据卷

【免费下载链接】mongoThe MongoDB Database项目地址: https://gitcode.com/GitHub_Trending/mo/mongo

MongoDB 官方开发环境使用 VS Code Dev Containers 构建,源码、Bazel 缓存、Python 虚拟环境和 EngFlow 凭据都存放在 Docker 命名卷(named volume)里,而不是宿主机的普通目录。容器本身可以随时删除或重建,但卷里的数据一旦丢失(比如换机器、误删卷、Docker 环境损坏),重建后这些缓存和凭据就要从零开始。本文介绍如何把这些持久化卷备份成 tar 包、在新卷上恢复,以及如何在机器之间迁移。

确认需要备份哪些卷

Dev Container 通过挂载的命名卷持久化数据。根据 getting-started 指南,核心卷及用途如下:

卷名容器内挂载点保存的内容
engflow_auth~/.config/engflow_authEngFlow 远程执行凭据
mongo-cache~/.cacheBazel 缓存、工具缓存
mongo-python3-venv/workspaces/mongo/python3-venvPython 虚拟环境
mongo-bashhistory/commandhistory终端命令历史

卷名中的前缀来自工作区卷名:devcontainer.json${containerWorkspaceFolderBasename}-cache这类模板在实际使用时以克隆时你选择的卷名为前缀,例如工作区卷名为mongo时就是mongo-cachemongo-python3-venv

在宿主机(不是容器内)执行:

# 列出所有卷,确认上述卷存在 docker volume ls # 查看某个卷的详情 docker volume inspect engflow_auth

如果列表里没有预期卷,先检查devcontainer.jsonmounts配置(见 troubleshooting 指南 中 "Check devcontainer.json mounts" 一节)。

备份卷到 tar 包

备份原理是启动一个一次性 Ubuntu 容器,把目标卷挂到/data、把当前目录挂到/backup,然后用tar打包。备份文件会写入宿主机当前工作目录,所以先把终端cd到你想存放备份文件的位置再执行命令。

单个卷备份:

docker run --rm \ -v engflow_auth:/data \ -v $(pwd):/backup \ ubuntu tar czf /backup/engflow_auth_backup.tar.gz -C /data .

文档给出的批量备份写法,一次覆盖三个主要卷:

# Backup all MongoDB dev volumes for vol in engflow_auth mongo-cache mongo-python3-venv; do docker run --rm \ -v $vol:/data \ -v $(pwd):/backup \ ubuntu tar czf /backup/${vol}_backup.tar.gz -C /data . done

执行完在$(pwd)下应能看到engflow_auth_backup.tar.gzmongo-cache_backup.tar.gzmongo-python3-venv_backup.tar.gz三个文件,用ls -lh *.tar.gz核对文件是否生成。

两点说明:

  • --rm表示备份容器退出后自动清理,不会留下多余容器。
  • mongo-cache通常体积较大(Bazel 缓存在 architecture 文档 的卷表中被标为 "Large"),备份耗时和磁盘占用都会明显高于另外两个卷。

从备份恢复卷

恢复的目标是把 tar 包写回一个卷,让 Dev Container 重新挂载后数据即可用。按 advanced 文档 的流程,在宿主机上先创建一个空卷,再解包进去:

# 创建卷(恢复前确保目标卷为空或已可丢弃) docker volume create engflow_auth # 恢复备份 docker run --rm \ -v engflow_auth:/data \ -v $(pwd):/backup \ ubuntu tar xzf /backup/engflow_auth_backup.tar.gz -C /data

其中/backup指向宿主机当前目录,engflow_auth_backup.tar.gz需要放在该目录下。恢复其他卷时把卷名和对应的 tar 包名替换即可。

architecture 文档 指出容器创建时postCreateCommand会执行fixVolumePerms,对~/.config/engflow_auth~/.cachechown修正卷内文件属主,所以恢复后重新打开容器时权限会被自动修正,不需要手动 chown。

恢复后的验证路径:

  1. 在 VS Code 中重新打开容器(FileRecent选择对应容器,或 "Dev Containers: Reopen in Container")。
  2. 进入容器终端检查挂载点:engflow_auth卷对应ls -la ~/.config/engflow_auth/,venv 卷对应which python应显示/workspaces/mongo/python3-venv/bin/python(见 getting-started 验证步骤)。
  3. 如果缓存卷已恢复,可跑一次bazel build install-mongod确认 Bazel 缓存可用、增量构建明显快于全新构建。

注意:恢复会向目标卷写入内容。如果目标卷里还有未备份的数据,恢复前请先确认该卷可以覆盖,或先对它再做一次备份。

可选分支:迁移到新机器

advanced 文档 提供了两种迁移方式:

方式一:备份卷 + 重新克隆(推荐主路径)

旧机器上按上文完成卷备份,把.tar.gz文件拷到新机器;新机器上按"恢复卷"一节解包,然后重新克隆仓库并打开 devcontainer 即可。

方式二:Docker 镜像 save/load(只迁移镜像,不含卷数据)

# 旧机器:导出容器镜像 docker save -o mongo-devcontainer.tar <image_id> # 新机器:导入镜像 docker load -i mongo-devcontainer.tar

这条路径只搬运构建好的镜像,卷里的凭据、缓存、venv 仍需按方式一处理。

限制与注意事项

  • 这些卷保存的是开发环境状态(凭据、构建缓存、Python 环境、命令历史),不是 mongod 数据库数据。容器内的/data/dbpostCreateCommandcreateDataDir创建在容器自身文件系统上,不属于命名卷。
  • docker volume rm会永久删除卷内数据,troubleshooting 文档 在"Volume Fills Up Disk"一节明确标注 "WARNING: loses data!"。清理磁盘前,先对需要保留的卷做备份。
  • 进程、apt-get临时安装的系统和/tmp里的文件本来就不持久化(见 FAQ 的 "Will my data persist after closing the container?"),备份卷也救不回这部分内容。
  • 文档中的卷名示例(mongo-cachemongo-python3-venv)以工作区卷名mongo为前提;如果你克隆时用了mongo-main这样的自定义卷名,备份循环中的卷名要相应替换。

【免费下载链接】mongoThe MongoDB Database项目地址: https://gitcode.com/GitHub_Trending/mo/mongo

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询