如何在删除重建Docker容器后保留PostgreSQL等业务数据?
Docker容器删除重建后数据保留问题修复
问题核心
你执行docker-compose down或docker-compose up -d --build后数据丢失,根源出在Nginx服务的存储卷配置不匹配,以及对Docker命名卷的行为理解偏差。
现有配置的错误点
- 静态/媒体文件存储不一致:Web服务用命名卷
static_volume、media_volume存储文件,但Nginx却挂载了主机当前目录下的./static_volume和./media_volume——这两个完全不是同一个存储位置!Web生成的文件存在命名卷里,Nginx读取的是空的主机目录,自然会出现数据丢失的假象。 - 若你执行
docker-compose down -v(带-v参数),会直接删除所有命名卷(包括PostgreSQL的db_data),这也会导致数据库数据丢失。
修正后的配置
将Nginx的存储卷改为和Web服务一致的命名卷,修正后的docker-compose.prod.yml如下:
version: '3.8' services: web: build: context: ./app dockerfile: Dockerfile.prod command: gunicorn ecap.wsgi:application --bind 0.0.0.0:8000 volumes: - static_volume:/home/app/web/staticfiles - media_volume:/home/app/web/mediafiles expose: - 8000 env_file: - ./.env.prod depends_on: - db db: image: postgres:13.0-alpine volumes: - db_data:/var/lib/postgresql/data/ env_file: - ./.env.prod.db nginx: build: ./nginx volumes: # 改用命名卷,与Web服务共用同一份文件存储 - static_volume:/home/app/web/staticfiles - media_volume:/home/app/web/mediafiles ports: - "80:80" depends_on: - web volumes: db_data: static_volume: media_volume:
关键注意事项
- PostgreSQL数据安全:
db_data是Docker命名卷,默认docker-compose down不会删除它,只有加上-v参数才会清除。如果要更稳妥,也可以将其改为主机绑定挂载(比如./postgres_data:/var/lib/postgresql/data/),但命名卷的性能和稳定性更适合数据库场景。 - 命令执行规范:
- 重新构建并启动容器用
docker-compose up -d --build,该命令不会改动命名卷内的数据。 - 停止并删除容器但保留数据,直接运行
docker-compose down即可,不要加-v参数。
- 重新构建并启动容器用
内容的提问来源于stack exchange,提问作者Tatsuya Nisato
相关产品推荐
相关产品推荐

