运行docker-compose时出现PostgreSQL连接localhost:5432被拒绝错误
错误原因
- 端口配置不匹配:PostgreSQL官方镜像默认内部监听端口为5432,你在docker-compose的postgres服务配置中,错误将内部暴露端口、端口映射都设置为了5430,导致postgres容器内部没有开放5432端口,app服务自然无法通过
postgres:5432访问到数据库。 - 配置优先级问题:你虽然修改了本地的application.properties文件,但如果没有重新打包生成jar包,Dockerfile中复制的还是旧的jar包,旧配置依然生效;另外如果你Spring Boot代码中没有读取docker-compose里传入的
POSTGRES_URL环境变量的话,这个环境变量也不会覆盖配置文件里的url。 - 端口配置不一致:你在application.properties中配置的服务端口是8086,但docker-compose里app服务的暴露端口、端口映射都写的是8081,会导致服务启动后无法正常对外提供访问。
- 数据库启动时序问题:
depends_on只能保证postgres容器先于app容器启动,无法保证Postgres服务内部初始化完成、可以接受连接时才启动app,若app启动过快也会出现连接拒绝错误。
解决方案
- 修正postgres服务的端口配置,修改docker-compose.yml中postgres服务的expose、ports字段:
postgres: image: postgres:latest network_mode: bridge container_name: postgres volumes: - postgres-data:/var/lib/postgresql/data expose: - 5432 # 暴露postgres默认内部端口 ports: - 5430:5432 # 宿主机5430映射到容器内部5432 environment: - POSTGRES_PASSWORD=root - POSTGRES_USER=postgres - POSTGRES_DB=employees
- 同步Spring Boot配置逻辑:如果你要使用docker-compose传入的
POSTGRES_URL环境变量,将application.properties中的spring.datasource.url修改为读取环境变量,避免硬编码和配置不同步问题:
spring.datasource.url=${POSTGRES_URL:jdbc:postgresql://postgres:5432/employees}
修改配置后重新执行mvn clean package(或对应gradle打包命令)生成新的jar包,再重新构建app镜像。
- 修正app服务的端口配置,增加异常重启策略解决启动时序问题:
app: image: app network_mode: bridge container_name: app expose: - 8086 # 和application.properties里配置的server.port保持一致 ports: - 8081:8086 # 宿主机8081映射容器内部8086 depends_on: - postgres links: - postgres restart: on-failure # 连接数据库失败时自动重启,规避数据库未就绪问题 environment: - POSTGRES_PASSWORD=root - POSTGRES_USER=postgres - POSTGRES_DB=employees - POSTGRES_URL=jdbc:postgresql://postgres:5432/employees
- 全部修改完成后执行以下命令重启服务:
docker-compose down -v # 清除旧的卷避免旧数据干扰 docker-compose up --build # 重新构建镜像并启动
内容的提问来源于stack exchange,提问作者Mariem Baratli
相关产品推荐
相关产品推荐

