Docker MySQL容器连接本地Spring Boot应用构建失败求助
问题根源梳理
你遇到的问题主要来自三个方面:
- Dockerfile逻辑错误,多阶段构建使用不当,最终生成的是MySQL镜像,无法运行Spring Boot应用
- Maven打包时测试阶段因缺少数据源配置,导致Spring上下文启动失败
- 本地Spring Boot连接Docker MySQL的配置逻辑错误
一、先解决Maven打包失败问题
临时方案:跳过测试打包
执行打包命令时直接跳过测试环节:
mvn clean package -DskipTests
持久方案:配置测试用嵌入式数据库
在src/test/resources下新建application-test.yml:
spring: datasource: url: jdbc:h2:mem:testdb driver-class-name: org.h2.Driver username: sa password: h2: console: enabled: true
然后在测试类上添加注解激活测试配置:
@ActiveProfiles("test") @SpringBootTest class CountriesRestApiApplicationTests { // 测试代码 }
二、正确启动Docker MySQL容器
不要把Spring Boot和MySQL打包到同一个镜像,遵循Docker单容器单进程原则,单独启动MySQL容器:
docker run -d \ --name mysql-countries \ -p 3307:3306 \ -e MYSQL_ROOT_PASSWORD=root \ -e MYSQL_DATABASE=Countries \ mysql:8.0.32
参数说明:
-p 3307:3306:将容器内部的MySQL默认端口3306映射到本地3307端口MYSQL_DATABASE=Countries:容器启动时自动创建指定名称的数据库MYSQL_ROOT_PASSWORD=root:设置MySQL root账号密码
三、本地Spring Boot连接Docker MySQL配置
修改src/main/resources/application.yml的数据源配置:
spring: datasource: url: jdbc:mysql://localhost:3307/Countries?useSSL=false&serverTimezone=UTC username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver
此时启动本地Spring Boot项目,即可正常连接Docker中的MySQL容器。
四、可选:将Spring Boot打包为Docker镜像
如果需要把Spring Boot也容器化,编写正确的Dockerfile(仅基于OpenJDK镜像):
FROM openjdk:17 COPY target/*.jar app.jar ENTRYPOINT ["java", "-jar", "/app.jar"]
构建并启动Spring Boot容器
- 构建镜像:
docker build -t countries-api .
- 创建Docker网络(让两个容器互通):
docker network create countries-network
- 重新启动MySQL容器并加入网络:
docker run -d \ --name mysql-countries \ --network countries-network \ -e MYSQL_ROOT_PASSWORD=root \ -e MYSQL_DATABASE=Countries \ mysql:8.0.32
- 启动Spring Boot容器:
docker run -d \ --name countries-api \ --network countries-network \ -p 8080:8080 \ -e SPRING_DATASOURCE_URL=jdbc:mysql://mysql-countries:3306/Countries?useSSL=false&serverTimezone=UTC \ -e SPRING_DATASOURCE_USERNAME=root \ -e SPRING_DATASOURCE_PASSWORD=root \ countries-api
同网络下,Spring Boot容器可以直接通过容器名mysql-countries访问MySQL服务。
原Dockerfile错误解析
- 多阶段构建逻辑错误:最后一个
FROM mysql:8.0.32会完全覆盖之前的OpenJDK镜像,最终生成的是MySQL镜像,没有Java环境,无法执行java -jar命令 - 环境变量配置错误:
MYSQL_HOST=0.0.0.0是MySQL容器的监听地址,不是Spring Boot的连接地址,连接地址应为宿主机IP或同网络下的容器名 - 违反Docker设计原则:将Spring Boot和MySQL打包到一个镜像,不符合单容器单进程的最佳实践,不利于维护和扩展
内容的提问来源于stack exchange,提问作者Humeyra KOSEOGLU
相关产品推荐
相关产品推荐

