如何备份和恢复 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_auth | EngFlow 远程执行凭据 |
mongo-cache | ~/.cache | Bazel 缓存、工具缓存 |
mongo-python3-venv | /workspaces/mongo/python3-venv | Python 虚拟环境 |
mongo-bashhistory | /commandhistory | 终端命令历史 |
卷名中的前缀来自工作区卷名:devcontainer.json里${containerWorkspaceFolderBasename}-cache这类模板在实际使用时以克隆时你选择的卷名为前缀,例如工作区卷名为mongo时就是mongo-cache和mongo-python3-venv。
在宿主机(不是容器内)执行:
# 列出所有卷,确认上述卷存在 docker volume ls # 查看某个卷的详情 docker volume inspect engflow_auth如果列表里没有预期卷,先检查devcontainer.json的mounts配置(见 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.gz、mongo-cache_backup.tar.gz、mongo-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和~/.cache做chown修正卷内文件属主,所以恢复后重新打开容器时权限会被自动修正,不需要手动 chown。
恢复后的验证路径:
- 在 VS Code 中重新打开容器(
File→Recent选择对应容器,或 "Dev Containers: Reopen in Container")。 - 进入容器终端检查挂载点:
engflow_auth卷对应ls -la ~/.config/engflow_auth/,venv 卷对应which python应显示/workspaces/mongo/python3-venv/bin/python(见 getting-started 验证步骤)。 - 如果缓存卷已恢复,可跑一次
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/db由postCreateCommand的createDataDir创建在容器自身文件系统上,不属于命名卷。 docker volume rm会永久删除卷内数据,troubleshooting 文档 在"Volume Fills Up Disk"一节明确标注 "WARNING: loses data!"。清理磁盘前,先对需要保留的卷做备份。- 进程、
apt-get临时安装的系统和/tmp里的文件本来就不持久化(见 FAQ 的 "Will my data persist after closing the container?"),备份卷也救不回这部分内容。 - 文档中的卷名示例(
mongo-cache、mongo-python3-venv)以工作区卷名mongo为前提;如果你克隆时用了mongo-main这样的自定义卷名,备份循环中的卷名要相应替换。
【免费下载链接】mongoThe MongoDB Database项目地址: https://gitcode.com/GitHub_Trending/mo/mongo
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考