Docker Compose无法同时运行Spring Boot与PostgreSQL服务问题求助
解决Docker Compose中Spring Boot服务无法启动的问题
我来帮你排查一下这个问题,从你提供的配置文件来看,有几个关键细节出错了,这应该就是导致Spring Boot服务启动失败的原因:
1. 数据库连接URL的双重错误
你的docker-compose.yml里Spring Boot的数据源URL写了jdbc:jdbc:postgresql://localhost:5432/test_db,这里有两个明显的问题:
- 多了一个
jdbc:前缀,PostgreSQL的JDBC URL正确格式应该是jdbc:postgresql://<主机>:<端口>/<数据库名> - 在Docker Compose的内部网络环境中,容器之间不能用
localhost访问其他服务,必须用服务名(也就是你定义的postgres)作为主机名——Compose会自动为每个服务创建内部DNS解析,直接用服务名就能访问对应的容器
修正后的URL应该是:
SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/test_db
另外,你还需要让PostgreSQL容器启动时自动创建test_db数据库,默认情况下PostgreSQL不会自动生成指定库,所以给PostgreSQL服务加一个环境变量:
postgres: image: 'postgres:13.1-alpine' container_name: db environment: - POSTGRES_USER=user - POSTGRES_PASSWORD=123456 - POSTGRES_DB=test_db
2. 先确认Spring Boot镜像构建是否正常
有时候镜像构建过程中会悄悄出错,导致容器无法启动。你可以先单独构建镜像并测试运行,看看有没有报错:
docker build -t linhan . docker run --rm linhan
检查输出是否有找不到jar包、JDK版本不兼容之类的错误。另外要注意,构建镜像前一定要先执行mvn package(Maven项目)或者gradle build(Gradle项目),确保target目录下确实存在LinhAn-0.0.1-SNAPSHOT.jar这个文件。
3. 查看容器启动日志定位具体问题
即使容器没正常运行,你也可以通过日志找到失败原因:
docker logs api
或者直接执行docker-compose up(不要加-d后台运行参数),实时查看前台输出的日志,这样能快速看到是数据库连接失败、依赖缺失还是其他启动错误。
修正后的完整配置参考
version: '2' services: spring_boot: image: 'linhan' build: . container_name: api ports: - "8080:8080" depends_on: - postgres environment: - SPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/test_db - SPRING_DATASOURCE_USERNAME=user - SPRING_DATASOURCE_PASSWORD=123456 - SPRING_JPA_HIBERNATE_DDL_AUTO=update postgres: image: 'postgres:13.1-alpine' container_name: db environment: - POSTGRES_USER=user - POSTGRES_PASSWORD=123456 - POSTGRES_DB=test_db # 如果需要从宿主机连接数据库,可以取消下面的注释 # ports: # - "5432:5432"
最后,执行docker-compose up --build(--build会强制重新构建Spring Boot镜像),应该就能正常启动两个服务了。
内容的提问来源于stack exchange,提问作者Daniel Tremblay
相关产品推荐
相关产品推荐

