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
相关产品推荐
相关产品推荐

