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

Spring Boot中Test Container(MySQL)无法找到Docker环境的问题修复求助

Docker部署Spring Boot应用的数据库连接与TestContainer故障修复

核心问题分析

从报错日志来看,存在两个关键问题:

  1. TestContainer无法找到Docker环境:构建阶段在容器内执行集成测试时,TestContainer需要访问Docker daemon,但容器内未运行Docker服务,导致初始化失败。
  2. 数据库连接失败:应用配置的数据库端口错误,且MySQL容器的端口配置存在无效项,导致无法建立连接。

具体修复步骤

1. 构建阶段跳过集成测试

Dockerfile的构建阶段(mvn package)会默认运行所有测试,但容器内无法提供TestContainer所需的Docker环境,因此需要跳过测试:
修改Dockerfile中的构建命令:

# 原命令
RUN mvn package

# 修改为
RUN mvn package -DskipTests

2. 修正数据库端口配置

(1)调整MySQL容器配置

docker-compose.yml中database服务的MYSQL_PORT:3307是无效配置——MySQL容器内部默认端口为3306,该环境变量无法修改容器内部端口,直接删除此项:

services:
  database:
    environment:
      # 删除以下无效配置
      # MYSQL_PORT: 3307

(2)修正应用数据库连接配置

bookdelivery服务的环境变量中,数据库端口应指向MySQL容器内部的3306端口,而非映射到宿主机的3307:

services:
  bookdelivery:
    environment:
      # 原配置
      # - BOOK_DELIVERY_DB_PORT=3307
      # - spring.datasource.url=jdbc:mysql://database:3307/bookdelivery
      
      # 修改为
      - BOOK_DELIVERY_DB_PORT=3306
      - spring.datasource.url=jdbc:mysql://database:3306/bookdelivery

3. 优化数据库启动就绪检查(可选)

depends_on仅保证容器启动顺序,不保证数据库服务就绪。为避免应用启动时数据库未初始化完成,可给database服务添加健康检查:

services:
  database:
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${DATABASE_PASSWORD}"]
      timeout: 20s
      retries: 10

同时修改bookdelivery服务的depends_on,等待数据库健康检查通过:

services:
  bookdelivery:
    depends_on:
      database:
        condition: service_healthy

本地测试注意事项

如果需要在本地运行集成测试,确保:

  • 本地Docker服务处于运行状态;
  • TestContainer依赖的Docker环境配置正常(无需额外修改代码,保持现有AbstractTestContainerConfiguration即可)。

内容的提问来源于stack exchange,提问作者Sercan Noyan Germiyanoğlu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 13:22:35