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

Spring应用数据无法持久化到Docker化PostgreSQL数据库求助

数据无法持久化到PostgreSQL数据库问题

部署Spring应用、PostgreSQL、Keycloak等Docker容器后,出现以下异常情况:

  • 调用接口创建实体时,能收到包含分配ID的DTO响应,且可通过其他接口查询到该实体
  • 进入PostgreSQL容器执行psql命令查询,结果显示数据为0行
  • 重启Spring容器后,所有创建的数据全部丢失

docker-compose.yml 配置

services:
  sales-service:
    container_name: service-container
    image: "mab123/sales-service:latest"
    environment:
      PG_HOST: postgres-container
    ports:
      - "8081:8081"
    networks:
      - internal
    depends_on:
      - postgres

  postgres:
    container_name: postgres-container
    image: postgres
    environment:
      POSTGRES_USER: ${POSTGRES_USER:-postgres}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
      POSTGRES_MULTIPLE_DATABASES: sales, keycloak
      POSTGRES_INITDB_ARGS: "--auth-host=scram-sha-256 --auth-local=scram-sha-256"
      PGDATA: /data/postgres
    volumes:
      - postgres:/data/postgres
      - ./src/main/resources/pg-init-scripts:/docker-entrypoint-initdb.d
    ports:
      - "5432:5432"
    restart: unless-stopped
    healthcheck:
      test: "PGPASSWORD=${POSTGRES_PASSWORD:-postgres} pg_isready -h 127.0.0.1 -U ${POSTGRES_USER:-postgres} -d sales"
    networks:
      - internal

  flyway:
    container_name: flyway
    image: flyway/flyway
    command: -url=jdbc:postgresql://postgres:5432/sales -user=postgres -password=postgres -locations=filesystem:/flyway/sql -connectRetries=60 migrate
    volumes:
      - ./src/main/resources/db/migration/:/flyway/sql/
    depends_on:
      postgres:
        condition: service_healthy
    networks:
      - internal

  keycloak:
    container_name: keycloak-container
    image: "quay.io/keycloak/keycloak:latest"
    volumes:
      - ./src/main/resources/keycloak/realms.json:/opt/keycloak/data/import/realms.json
    env_file:
      - src/main/resources/keycloak/keycloak.env
    ports:
      - "8080:8080"
    restart: unless-stopped
    entrypoint: [ "/opt/keycloak/bin/kc.sh", "start-dev", "--import-realm" ]
    networks:
      internal:
        aliases:
          - keycloak.keycon.com
    depends_on:
      - postgres

volumes:
  postgres:

networks:
  internal:

application-dev.yml 配置

spring:
  datasource:
    url: jdbc:postgresql://${PG_HOST:localhost}:5432/sales
    username: postgres
    password: postgres
  flyway:
    datasources:
      default:
        enabled: true

排查方向

  1. 事务未提交:检查创建实体的业务方法是否遗漏@Transactional注解,或存在手动开启事务但未执行commit的情况。
  2. 数据源验证:查看Spring应用日志,确认实际连接的是容器内的PostgreSQL,而非本地内存数据库(如H2)。
  3. Flyway脚本问题:检查Flyway迁移脚本是否存在重置表数据的逻辑,或脚本执行后未正确初始化表结构。
  4. 连接池属性:确认spring.datasource.hikari.auto-commit是否设置为false,若未手动提交事务,数据不会写入数据库。
  5. 数据卷挂载:执行docker volume inspect postgres查看数据卷状态,确认PostgreSQL容器的数据是否正常持久化到宿主机。
  6. 实体映射错误:检查JPA实体类是否遗漏@Entity注解,或主键生成策略配置错误导致数据未写入数据库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:20:40