如何在Docker环境下的Django Web容器与PostgreSQL数据库容器之间共享备份文件?
解决Docker环境下Django备份恢复与跨容器文件共享问题
一、核心问题拆解
你碰到的几个问题本质是容器间挂载路径不匹配、旧Docker版本不支持直接跨容器复制,以及预生产环境备份任务的配置/权限异常,下面逐个给出解决方案:
二、修复psql \i文件不存在的报错
你已经通过backup_volume实现了web和db容器的文件共享,但两个容器的挂载路径不一样:
web容器将卷挂载到:/usr/src/app/backupdb容器将卷挂载到:/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版本不支持直接在两个容器间复制文件,需要通过宿主机中转:
- 先把
web容器的备份文件复制到宿主机当前目录:
docker cp web:/usr/src/app/backup/backup_2021-01-19_1336.psql ./
- 再将文件复制到
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
相关产品推荐
相关产品推荐

