Spring Boot连接Docker中PostgreSQL遇pg_hba.conf及SSL问题求助
解决Spring Boot连接Docker PostgreSQL的pg_hba.conf与SSL问题
方案一:快速规避pg_hba.conf错误(无需SSL)
这个错误核心是PostgreSQL默认的pg_hba.conf未允许Spring Boot容器所在的网段连接。Docker Compose默认会为服务创建专属内部网络,只需让Postgres信任该网络的连接即可:
操作步骤
修改
docker-compose.yml,移除Spring Boot数据源的SSL参数,同时给Postgres添加信任配置:services: belt-microservice: build: belt-microservices container_name: belt-microservice restart: always environment: - SPRING_DATASOURCE_URL=jdbc:postgresql://db-belt:5432/belt_microservices - SPRING_DATASOURCE_USERNAME=postgres - SPRING_DATASOURCE_PASSWORD=password ports: - "8080:8080" depends_on: - db-belt db-belt: image: postgres container_name: db-belt environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=password - POSTGRES_DB=belt_microservices - PGDATA=/var/lib/postgresql/data/pgdata - POSTGRES_HOST_AUTH_METHOD=trust # 测试环境快速允许所有连接 ports: - "5000:5432" volumes: - pgdata:/var/lib/postgresql/data restart: always volumes: pgdata:生产环境注意:不要用
trust,建议自定义pg_hba.conf挂载到容器,添加允许Docker网段的规则。例如创建pg_hba.conf文件,添加一行host all all 172.17.0.0/16 md5(Docker默认网桥网段),然后在db-belt的volumes中添加- ./pg_hba.conf:/var/lib/postgresql/data/pg_hba.conf。重启容器生效:
docker-compose down && docker-compose up -d
方案二:配置PostgreSQL容器支持SSL连接
如果业务要求必须使用SSL,需要生成自签名证书并配置Postgres:
操作步骤
生成SSL证书(用OpenSSL生成自签名证书):
# 创建证书目录 mkdir -p ./postgres-ssl && cd ./postgres-ssl # 生成根证书 openssl req -new -x509 -days 365 -nodes -text -out root.crt -keyout root.key -subj "/CN=root" # 生成服务器证书 openssl req -new -nodes -text -out server.csr -keyout server.key -subj "/CN=db-belt" openssl x509 -req -in server.csr -text -days 365 -CA root.crt -CAkey root.key -CAcreateserial -out server.crt # 修改证书权限,适配Postgres要求 chmod 600 server.key root.key修改
docker-compose.yml,挂载证书并启用SSL:services: belt-microservice: build: belt-microservices container_name: belt-microservice restart: always environment: - SPRING_DATASOURCE_URL=jdbc:postgresql://db-belt:5432/belt_microservices?ssl=true&sslmode=verify-ca&sslrootcert=/postgres-ssl/root.crt - SPRING_DATASOURCE_USERNAME=postgres - SPRING_DATASOURCE_PASSWORD=password ports: - "8080:8080" depends_on: - db-belt volumes: - ./postgres-ssl:/postgres-ssl # 挂载证书到Spring Boot容器 db-belt: image: postgres container_name: db-belt environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=password - POSTGRES_DB=belt_microservices - PGDATA=/var/lib/postgresql/data/pgdata - POSTGRES_SSL=on # 启用SSL - POSTGRES_SSL_CERT_FILE=/var/lib/postgresql/data/server.crt - POSTGRES_SSL_KEY_FILE=/var/lib/postgresql/data/server.key - POSTGRES_SSL_CA_FILE=/var/lib/postgresql/data/root.crt ports: - "5000:5432" volumes: - ./postgres-ssl/server.crt:/var/lib/postgresql/data/server.crt - ./postgres-ssl/server.key:/var/lib/postgresql/data/server.key - ./postgres-ssl/root.crt:/var/lib/postgresql/data/root.crt - pgdata:/var/lib/postgresql/data restart: always volumes: pgdata:重启容器生效:
docker-compose down && docker-compose up -d
额外排查要点
- 之前添加的
networks: default: external: false属于冗余配置,Docker Compose默认会创建内部专属网络,无需额外声明;若存在残留网络问题,可执行docker network prune清理无用网络后重启。 - 测试容器连通性:进入Spring Boot容器执行
ping db-belt,确认主机名解析正常。 - 查看Postgres日志:执行
docker logs db-belt,排查启动或连接相关的错误信息。
内容的提问来源于stack exchange,提问作者camilajenny
相关产品推荐
相关产品推荐

