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

Testcontainers启动MySQL 8.2时因日志匹配超时抛出ContainerLaunchException

解决Testcontainers匹配MySQL 8.2.x就绪日志超时问题

问题原因

MySQL 8.2.x的就绪日志输出格式发生了变化,Testcontainers默认等待的日志串是database system is ready to accept connections,但实际启动日志输出的是[Server] /usr/sbin/mysqld: ready for connections. Version: '8.2.0' ...,导致日志匹配失败触发超时。

解决方案(基于DockerComposeContainer)

方法1:自定义日志匹配规则

在测试代码中给DockerComposeContainer指定新的日志匹配正则,替换默认规则:

DockerComposeContainer<?> composeContainer = new DockerComposeContainer<>(new File("docker-compose.yml"))
    .withExposedService("mysql", 3306, 
        Wait.forLogMessage(".*ready for connections.*", 1)
            .withStartupTimeout(Duration.ofSeconds(60)));
  • .*ready for connections.*:匹配包含目标字符串的任意日志行
  • 1:表示需要匹配到1次该日志
  • withStartupTimeout:按需调整超时时间,避免资源不足导致的误判

方法2:使用容器健康检查替代日志匹配

在docker-compose.yml中给MySQL服务配置健康检查,让Testcontainers通过健康状态判断服务是否就绪,这种方式不依赖日志格式,更稳定:

services:
  mysql:
    image: mysql:8.2.0
    environment:
      MYSQL_ROOT_PASSWORD: your_root_password
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-pyour_root_password"]
      interval: 5s  # 每5秒检查一次
      timeout: 5s   # 检查超时时间
      retries: 10   # 最多重试10次

然后在测试代码中指定等待健康检查完成:

DockerComposeContainer<?> composeContainer = new DockerComposeContainer<>(new File("docker-compose.yml"))
    .withExposedService("mysql", 3306, Wait.forHealthcheck());

补充:如果使用独立MySQLContainer

如果不是用docker-compose,而是直接使用Testcontainers的MySQLContainer类,可以直接修改启动日志匹配规则:

MySQLContainer<?> mysqlContainer = new MySQLContainer<>("mysql:8.2.0")
    .withStartupLogMessagePattern(".*ready for connections.*");

内容的提问来源于stack exchange,提问作者d.braun1991

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 10:42:03