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

