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

Docker Compose中PostgreSQL数据持久化异常问题

PostgreSQL Docker Compose 数据持久化问题:down 后重启丢失数据

问题场景

在 Spring Boot + PostgreSQL 的 Docker Compose 环境中出现数据持久化异常:

  • 单独停止并重启 PostgreSQL 容器时,数据可正常保留
  • 执行 docker-compose down 关闭整个栈后再启动,数据库数据完全丢失

当前使用的 docker-compose.yml 配置:

version: '3.8'
services:
  postgres:
    image: postgres:latest
    container_name: postgres-container
    environment:
      POSTGRES_DB: jwt_security
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
    volumes:
      - postgres-data:/var/lib/postgresql/data
    ports:
      - "5431:5432"

  app:
    image: my-spring-app # 替换为实际 Spring Boot 镜像名
    container_name: spring-boot-app
    environment:
      SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/jwt_security
      SPRING_DATASOURCE_USERNAME: postgres
      SPRING_DATASOURCE_PASSWORD: password
    depends_on:
      - postgres
    ports:
      - "8080:8080" # 若应用端口不同可调整

volumes:
  postgres-data:
    external: true

已尝试操作:

  1. 移除现有容器和卷:
docker-compose down -v
docker volume rm postgres-data
  1. 创建外部卷:
docker volume create --name postgres-data
  1. 启动容器:
docker-compose up

验证细节:

  • 插入数据后,通过 docker exec -it postgres-container psql -U postgres -d jwt_security 执行 SELECT * FROM _user; 可正常查询到数据
  • 外部卷已确认创建并挂载
  • PostgreSQL 容器日志显示初始化正常,但重启栈后数据丢失

排查与解决方案

1. 确认外部卷的实际挂载状态

执行以下命令检查卷的关联信息和挂载路径:

# 查看外部卷详情
docker volume inspect postgres-data
# 查看容器挂载配置
docker inspect postgres-container | grep -A 10 "Mounts"

确认 Mounts 中的 Source 路径对应外部卷的实际存储路径,且该路径下存在 PostgreSQL 数据文件(如 base 文件夹、postgresql.conf 等)。

2. 检查外部卷权限

PostgreSQL 容器内部以 postgres 用户(UID 999)运行,若外部卷挂载路径权限不匹配,容器无法写入数据。

  • 手动修改卷路径权限:
# 获取外部卷存储路径
VOLUME_PATH=$(docker volume inspect postgres-data --format '{{.Mountpoint}}')
# 修改权限
sudo chown -R 999:999 $VOLUME_PATH
  • 或在 Docker Compose 中指定用户:
services:
  postgres:
    # ... 其他配置
    user: "999:999"

3. 固定 PostgreSQL 镜像版本

postgres:latest 镜像会自动更新,不同版本的数据目录结构可能存在差异,建议固定版本(如 postgres:15-alpine):

services:
  postgres:
    image: postgres:15-alpine
    # ... 其他配置

4. 检查 Spring Boot 应用的 DDL 配置

若应用配置了 spring.jpa.hibernate.ddl-auto=create 或 create-drop,会在启动时重建表结构导致数据丢失。修改配置为:

# application.properties
spring.jpa.hibernate.ddl-auto=update

或

# application.yml
spring:
  jpa:
    hibernate:
      ddl-auto: update

5. 验证卷未被意外删除

默认情况下 docker-compose down 不会删除外部卷,执行以下命令确认卷存在:

docker volume ls | grep postgres-data

验证步骤

  1. 按照上述方案修正配置后重启容器
  2. 插入测试数据
  3. 执行 docker-compose down 关闭栈
  4. 执行 docker-compose up 重启
  5. 再次查询数据库,确认数据是否保留

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 07:54:59