Spring Boot应用Docker化时关闭MySQL出现数据库连接错误
问题分析与解决方案
问题根源
你的Spring Boot应用(含测试代码)的数据库连接配置指向了本地主机(localhost/127.0.0.1),而非Docker Compose网络内的MySQL服务容器。当本地MySQL运行时,应用能正常建立连接;关闭本地MySQL后,因找不到可用数据库节点,触发Hikari连接池初始化失败的CommunicationsException,导致测试环节无法完成。
解决方案
1. 修正数据库连接配置
修改项目中application.properties或application.yml的数据库URL,将localhost替换为Docker Compose中MySQL服务的名称(比如你的docker-compose.yml里MySQL服务名设为mysql,就写mysql)。
示例(application.properties):
spring.datasource.url=jdbc:mysql://mysql:3306/your_db_name?useSSL=false&serverTimezone=UTC spring.datasource.username=${DB_USERNAME} spring.datasource.password=${DB_PASSWORD}
示例(application.yml):
spring: datasource: url: jdbc:mysql://mysql:3306/your_db_name?useSSL=false&serverTimezone=UTC username: ${DB_USERNAME} password: ${DB_PASSWORD}
2. 确保Docker Compose配置合规
你的docker-compose.yml需要满足以下要求:
- 定义MySQL服务并配置对应环境变量(匹配
.env中的参数) - 让Spring Boot服务与MySQL服务处于同一Docker网络(默认compose会自动创建共享网络,只要服务在同一文件内即自动加入)
- 配置启动依赖,确保MySQL先启动;若要保证MySQL完全就绪,可添加健康检查
示例docker-compose.yml片段:
version: '3.8' services: mysql: image: mysql:8.0 environment: MYSQL_DATABASE: ${DB_NAME} MYSQL_USER: ${DB_USERNAME} MYSQL_PASSWORD: ${DB_PASSWORD} MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "${DB_USERNAME}", "-p${DB_PASSWORD}"] interval: 5s timeout: 5s retries: 5 app: build: . environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/${DB_NAME}?useSSL=false&serverTimezone=UTC SPRING_DATASOURCE_USERNAME: ${DB_USERNAME} SPRING_DATASOURCE_PASSWORD: ${DB_PASSWORD} ports: - "8080:8080" depends_on: mysql: condition: service_healthy volumes: mysql_data:
3. 调整测试阶段连接配置
若测试代码仍指向本地MySQL,需在src/test/resources下创建application-test.properties/application-test.yml,将测试环境的数据库URL同样指向Docker Compose的MySQL服务名。
如果暂时不需要运行测试验证,可先跳过测试构建:
./mvnw clean package -DskipTests && docker-compose build && docker-compose up
内容的提问来源于stack exchange,提问作者Taha Furkan Ünsal
相关产品推荐
相关产品推荐

