Docker部署Spring Boot连接MySQL遇CommunicationsException连接失败
解决Maven打包测试阶段MySQL连接失败问题
核心问题分析
- Maven执行
mvn clean package时默认会运行单元测试,此时你的Docker Compose服务(包括MySQL容器)还未启动,配置mysqldb:3306根本无法被本地环境解析; - 即使本地MySQL正常,用
localhost:3306也可能因为测试配置未正确生效、MySQL权限限制(比如账号仅允许特定IP访问),或者单元测试本身就不该依赖真实数据库的设计原则导致问题。
快速解决方案
方案1:跳过测试阶段打包
如果只是想快速完成镜像构建,直接跳过测试环节:
# 跳过测试执行但保留测试代码编译 mvn clean package -DskipTests # 完全跳过测试相关的编译和执行 mvn clean package -Dmaven.test.skip=true
方案2:配置测试专用内存数据库(推荐)
单元测试应该使用轻量的内存数据库(比如H2),避免依赖外部服务:
- 在
pom.xml中添加H2依赖(仅测试环境生效):
<dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>test</scope> </dependency>
- 在
src/test/resources下创建application-test.yml配置文件:
spring: datasource: url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1 driver-class-name: org.h2.Driver username: sa password: jpa: hibernate: ddl-auto: create-drop show-sql: true
- 在测试类上指定激活测试配置:
@SpringBootTest @ActiveProfiles("test") public class YourApplicationTests { // 测试代码 }
后续Docker Compose部署注意事项
当镜像构建完成后,通过Docker Compose启动服务时,Spring Boot应用容器内的spring.datasource.url配置为jdbc:mysql://mysqldb:3306/your_db_name是正确的——因为Docker Compose会为服务创建专属网络,服务名mysqldb可以直接解析到MySQL容器的IP。
内容的提问来源于stack exchange,提问作者milanHrabos
相关产品推荐
相关产品推荐

