Spring Boot项目Docker化时测试类数据库连接失败问题排查
解决Spring Boot Docker化时测试类数据库连接拒绝问题
问题根源
你当前的命令执行顺序是先在本地运行./mvnw clean package(此时Docker数据库容器尚未启动),测试类尝试连接数据库自然会失败。要通过调整docker-compose.yml解决,需要把Maven构建(含测试)纳入Docker编排流程,确保测试运行时数据库服务已就绪。
修改后的docker-compose.yml示例
假设你的数据库是PostgreSQL,以下是调整后的配置:
version: '3.8' services: db: image: postgres:15-alpine environment: POSTGRES_USER: ${DB_USER} POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_DB: ${DB_NAME} ports: - "${DB_PORT}:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USER} -d ${DB_NAME}"] interval: 5s timeout: 5s retries: 5 maven-build: image: maven:3.8.6-openjdk-17 volumes: - .:/app - ~/.m2:/root/.m2 working_dir: /app environment: SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/${DB_NAME} SPRING_DATASOURCE_USERNAME: ${DB_USER} SPRING_DATASOURCE_PASSWORD: ${DB_PASSWORD} command: ./mvnw clean package -DskipTests=false depends_on: db: condition: service_healthy app: build: . ports: - "${APP_PORT}:8080" environment: SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/${DB_NAME} SPRING_DATASOURCE_USERNAME: ${DB_USER} SPRING_DATASOURCE_PASSWORD: ${DB_PASSWORD} depends_on: maven-build: condition: service_completed_successfully db: condition: service_healthy
关键调整说明
- 数据库健康检查:给
db服务添加healthcheck,确保数据库完全启动就绪后才执行后续步骤,避免测试连接时数据库还在初始化。 - Maven构建服务:新增
maven-build服务,使用官方Maven镜像运行构建命令,环境变量中配置测试用的数据库URL(指向Docker内部的db服务名,而非localhost),并依赖db服务的健康状态。 - 依赖关系配置:
app服务依赖maven-build执行完成,确保构建产物(jar包)已生成后再构建应用镜像并启动。
执行命令
替换原命令为:
docker-compose up --build
此命令会自动完成:启动数据库→运行Maven构建(含测试)→构建应用镜像→启动应用服务,全程在Docker网络内运行,测试类可正常访问数据库。
额外注意事项
- 确保你的Spring Boot测试配置(如
application-test.properties)中,数据库URL使用db(Docker服务名)而非localhost,这样在Docker网络内才能正确解析。 .env文件中的数据库配置要与docker-compose.yml中的环境变量保持一致。
内容的提问来源于stack exchange,提问作者Taha Ünsal
相关产品推荐
相关产品推荐

