You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker MySQL容器连接本地Spring Boot应用构建失败求助

问题根源梳理

你遇到的问题主要来自三个方面:

  1. Dockerfile逻辑错误,多阶段构建使用不当,最终生成的是MySQL镜像,无法运行Spring Boot应用
  2. Maven打包时测试阶段因缺少数据源配置,导致Spring上下文启动失败
  3. 本地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容器

  1. 构建镜像:
docker build -t countries-api .
  1. 创建Docker网络(让两个容器互通):
docker network create countries-network
  1. 重新启动MySQL容器并加入网络:
docker run -d \
  --name mysql-countries \
  --network countries-network \
  -e MYSQL_ROOT_PASSWORD=root \
  -e MYSQL_DATABASE=Countries \
  mysql:8.0.32
  1. 启动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错误解析

  1. 多阶段构建逻辑错误:最后一个FROM mysql:8.0.32会完全覆盖之前的OpenJDK镜像,最终生成的是MySQL镜像,没有Java环境,无法执行java -jar命令
  2. 环境变量配置错误:MYSQL_HOST=0.0.0.0是MySQL容器的监听地址,不是Spring Boot的连接地址,连接地址应为宿主机IP或同网络下的容器名
  3. 违反Docker设计原则:将Spring Boot和MySQL打包到一个镜像,不符合单容器单进程的最佳实践,不利于维护和扩展

内容的提问来源于stack exchange,提问作者Humeyra KOSEOGLU

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 13:54:55