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

Docker Compose部署Spring Boot微服务连接PostgreSQL异常排查

解决Docker Compose部署Spring Boot时PostgreSQL角色认证冲突问题

问题现象

  • 用Docker Compose部署Spring Boot微服务,PostgreSQL配置用户为postgres、密码password
  • Spring Boot服务启动日志提示认证失败:
    2023-05-07 10:30:48 2023-05-07T07:30:48.725Z  INFO 1 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
    2023-05-07 10:30:49 2023-05-07T07:30:49.863Z ERROR 1 --- [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Exception during pool initialization.
    2023-05-07 10:30:49 
    2023-05-07 10:30:49 org.postgresql.util.PSQLException: FATAL: password authentication failed for user "postgres"
    ...
    
  • PostgreSQL容器日志显示角色不存在:
    2023-05-07 10:30:51 2023-05-07 07:30:51.287 UTC [41] DETAIL:  Role "postgres" does not exist.
    2023-05-07 10:30:51     Connection matched pg_hba.conf line 100: "host all all all scram-sha-256"
    
  • 进入PostgreSQL容器控制台尝试创建postgres用户时,却提示该角色已存在。

相关配置文件:

docker-compose.yml

postgres-order:
  container_name: postgres-order
  image: postgres
  environment:
    POSTGRES_DB: order_service
    POSTGRES_USER: postgres
    POSTGRES_PASSWORD: password
    PGDATA: /data/postgres
  volumes:
    - ./postgres-order:/data/postgres
  ports:
    - "5431:5431"
  command: -p 5431
  expose:
    - "5431"
  restart: always


order-service:
  container_name: order-service
  image: registry.hub.docker.com/jirafus400/order-service:latest
  environment:
    - SPRING_PROFILES_ACTIVE=docker
    - SPRING_DATASOURCE_URL=jdbc:postgresql://postgres-order:5431/order_service
  depends_on:
    - postgres-order
    - broker
    - eureka-server
    - api-gateway

application-docker.properties

spring.datasource.url=jdbc:postgresql://postgres-order:5431/order_service
spring.datasource.username=postgres
spring.datasource.password=password
spring.datasource.driver-class-name=org.postgresql.Driver
server.port=8080
eureka.client.serviceUrl.defaultZone=http://eureka:password@eureka-server:8761/eureka
spring.kafka.bootstrap-servers=broker:29092

核心原因

PostgreSQL容器的初始化逻辑仅在首次启动且数据目录为空时执行。你配置了本地卷./postgres-order:/data/postgres,如果该目录之前已经存在旧的PostgreSQL数据(比如之前未指定POSTGRES_USER启动过容器,或者修改过环境变量但未清理卷),容器启动时会跳过初始化步骤,导致数据库内的实际用户/密码和当前docker-compose.yml配置不一致。

这就解释了为什么容器日志说角色不存在(当前配置的用户未被初始化),但手动进入容器又能看到该角色(来自旧数据)。

解决方案

方案1:清理旧卷数据(推荐,适用于测试环境或可重置数据的场景)

  1. 停止并删除容器及关联卷:
    docker-compose down -v
    
    或者手动删除本地卷目录:
    rm -rf ./postgres-order
    
  2. 重新启动容器:
    docker-compose up -d
    
    此时PostgreSQL会重新执行初始化,根据POSTGRES_USER和POSTGRES_PASSWORD创建用户和数据库。

方案2:手动调整现有数据库用户(适用于需要保留数据的场景)

  1. 进入PostgreSQL容器:
    docker exec -it postgres-order psql -U postgres
    
    如果旧数据的默认用户不是postgres,需用实际存在的用户登录(可查看容器初始化日志找初始用户)。
  2. 查看当前所有用户:
    \du
    
  3. 如果postgres用户存在但密码不匹配,修改密码:
    ALTER USER postgres WITH PASSWORD 'password';
    
  4. 如果postgres用户确实不存在,创建用户并授权:
    CREATE USER postgres WITH PASSWORD 'password';
    GRANT ALL PRIVILEGES ON DATABASE order_service TO postgres;
    

验证步骤

  1. 查看PostgreSQL容器日志,确认出现database system is ready to accept connections,且无角色不存在的错误。
  2. 查看Spring Boot服务日志,确认HikariPool初始化成功,无认证失败报错。
  3. 调用服务接口,验证数据库访问正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 01:09:59