如何使用docker-compose从备份恢复Docker卷
答案
完全可以实现和docker run完全一致的恢复逻辑,不需要改动原有业务容器的核心配置,先拆解官方恢复命令的核心逻辑:
- 启动一个用完即删的临时容器
- 关联挂载目标业务容器的数据卷
- 挂载主机上存放备份包的目录到临时容器内
- 进入数据卷挂载路径,解压备份包完成数据写入
方案一:不修改现有compose.yaml,直接执行一次性恢复命令(最推荐)
不需要改动任何现有配置,直接用docker compose run执行和官方逻辑完全对齐的临时任务即可,命令参考:
# 先停掉要恢复的目标业务容器,避免写入冲突 docker compose stop dbstore # 执行恢复,参数和官方docker run逻辑完全对应 docker compose run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1" # 恢复完成后重启业务容器 docker compose start dbstore
参数说明:
--rm:临时恢复容器执行完命令后自动删除,不留冗余资源--volumes-from dbstore:把compose中名为dbstore的服务的所有数据卷挂载到临时容器中,对应官方命令里的--volumes-from dbstore2-v $(pwd):/backup:把当前主机目录(存放backup.tar的路径)挂载到临时容器的/backup路径,和官方命令逻辑一致- 后续的bash解压命令和官方给出的完全一致,直接复用即可
方案二:将恢复逻辑写入compose.yaml,按需触发
如果需要把恢复逻辑沉淀到配置文件中,可以新增一个带profile标识的一次性恢复服务,不会影响日常业务启动,配置参考:
version: '3.8' services: # 原有业务数据库服务,保持原有配置不变 dbstore: image: 你的业务镜像地址 volumes: - dbdata:/dbdata # 其余原有配置(端口、环境变量等)无需改动 # 新增一次性恢复服务 db-restore: image: ubuntu volumes: - dbdata:/dbdata # 和业务服务共享同一个命名数据卷 - ./backup:/backup # 挂载主机上存放备份包的目录 command: bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1" profiles: ["restore"] # 配置独立启动配置组,日常启动业务不会触发该服务 depends_on: - dbstore # 原有命名卷定义保持不变 volumes: dbdata:
使用方式:
- 先停掉正在运行的dbstore服务,避免文件写入冲突
- 执行
docker compose run --rm db-restore即可触发恢复流程 - 恢复完成后正常执行
docker compose up -d启动业务即可
注意事项
- 恢复前务必确认目标卷内的残留数据是否需要保留,若需要完全覆盖恢复,可以把解压命令调整为
bash -c "rm -rf /dbdata/* && cd /dbdata && tar xvf /backup/backup.tar --strip 1",避免旧文件和恢复文件混杂 --strip 1参数需要和你备份时的打包层级匹配:如果备份时是直接在/dbdata目录下打包所有内容,该参数无需调整;如果备份包多嵌套了一层目录,需要对应调整strip的数值,避免解压后目录结构错误- 恢复过程中不要启动业务进程写入数据卷,否则可能出现文件损坏、数据不一致的问题
内容的提问来源于stack exchange,提问作者Duk
相关产品推荐
相关产品推荐

