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

如何在Docker环境下的Django Web容器与PostgreSQL数据库容器之间共享备份文件?

解决Docker环境下Django备份恢复与跨容器文件共享问题

一、核心问题拆解

你碰到的几个问题本质是容器间挂载路径不匹配、旧Docker版本不支持直接跨容器复制,以及预生产环境备份任务的配置/权限异常,下面逐个给出解决方案:


二、修复psql \i文件不存在的报错

你已经通过backup_volume实现了web和db容器的文件共享,但两个容器的挂载路径不一样:

  • web容器将卷挂载到:/usr/src/app/backup
  • db容器将卷挂载到:/var/lib/postgresql/data/backup

所以在db容器的psql shell里,必须使用db容器内的挂载路径,而非web容器的路径。正确的恢复命令是:

db_preprod=# \i '/var/lib/postgresql/data/backup/backup_2021-01-19_1336.psql'

三、解决docker cp跨容器复制失败的问题

你使用的Docker Compose 1.27.4对应的Docker版本不支持直接在两个容器间复制文件,需要通过宿主机中转:

  1. 先把web容器的备份文件复制到宿主机当前目录:
docker cp web:/usr/src/app/backup/backup_2021-01-19_1336.psql ./
  1. 再将文件复制到db容器的备份目录下:
docker cp ./backup_2021-01-19_1336.psql db:/var/lib/postgresql/data/backup/

四、本地直接访问backup_volume的方法

根据你提供的卷信息,这个本地卷的实际存储路径是:

/var/lib/docker/volumes/cafe_tropical_backup_volume/_data

你可以直接在宿主机终端访问该路径,查看、修改或添加备份文件,所有挂载了该卷的容器都会同步看到这些文件。


五、排查预生产环境备份缺失的问题

预生产环境(Nginx+Gunicorn)的今日备份找不到,而开发环境(django runserver)能看到昨日备份,大概率是以下原因:

  • Celery/DBBackup配置异常:检查Celery worker是否正确挂载了backup_volume,确保DBBackup的备份存储路径和web容器的/usr/src/app/backup完全一致。
  • 目录权限问题:预生产环境的web容器可能用非root用户运行(比如Gunicorn常用的www-data或自定义用户),而/usr/src/app/backup目录的权限不允许该用户写入。可执行以下命令检查:
docker exec web ls -ld /usr/src/app/backup

如果权限不符,在Dockerfile.preprod中添加目录权限设置:

RUN mkdir -p /usr/src/app/backup && chown -R your_app_user:your_app_group /usr/src/app/backup
  • 备份任务未正常执行:查看Celery日志,确认备份任务是否触发、有没有报错:
docker logs <你的celery_worker容器名称>

也可以手动在web容器执行备份命令测试:

docker exec web python manage.py dbbackup

内容的提问来源于stack exchange,提问作者Mereva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 04:48:13