You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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:

使用方式:

  1. 先停掉正在运行的dbstore服务,避免文件写入冲突
  2. 执行docker compose run --rm db-restore即可触发恢复流程
  3. 恢复完成后正常执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 06:57:18