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

如何在删除重建Docker容器后保留PostgreSQL等业务数据?

Docker容器删除重建后数据保留问题修复

问题核心

你执行docker-compose down或docker-compose up -d --build后数据丢失,根源出在Nginx服务的存储卷配置不匹配,以及对Docker命名卷的行为理解偏差。

现有配置的错误点

  1. 静态/媒体文件存储不一致:Web服务用命名卷static_volume、media_volume存储文件,但Nginx却挂载了主机当前目录下的./static_volume和./media_volume——这两个完全不是同一个存储位置!Web生成的文件存在命名卷里,Nginx读取的是空的主机目录,自然会出现数据丢失的假象。
  2. 若你执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 09:10:44