JUnit5测试完成后开启withReuse的Testcontainers未自动删除如何解决
Testcontainers复用容器自动清理方案
下面是三种可直接落地的实现方式,你可以根据自己的使用场景选择:
1. 本地开发环境定时脚本
Testcontainers的复用容器默认会携带org.testcontainers.reuse=true的标签,你可以直接用docker的筛选能力做定时清理:
- 清理命令如下,会删除创建时间超过1小时的所有Testcontainers复用容器:
docker container prune --filter "label=org.testcontainers.reuse=true" --filter "until=1h" -f
- Linux/macOS下配置定时任务:执行
crontab -e,新增如下配置即可实现每小时整点执行清理:
0 * * * * docker container prune --filter "label=org.testcontainers.reuse=true" --filter "until=1h" -f
- Windows下可以通过「任务计划程序」,配置每小时触发一次上述docker命令即可。
2. CI流水线单次清理
如果是在CI环境运行测试,不需要定时清理,直接在构建流水线的最后一步添加如下命令,每次构建完成后统一清理所有复用容器即可:
docker container prune --filter "label=org.testcontainers.reuse=true" -f
3. 测试层全局自动清理
你也可以通过JUnit5扩展实现每次启动测试时,自动清理超过2小时的历史复用容器:
- 新增全局扩展类:
public class CleanupReusableContainersExtension implements BeforeAllCallback, Extension { @Override public void beforeAll(ExtensionContext context) throws Exception { // 只在测试套件启动时执行一次清理,避免重复执行 if (context.getRoot().getStore(ExtensionContext.Namespace.GLOBAL).get("cleanupExecuted") == null) { new ProcessBuilder("docker", "container", "prune", "--filter", "label=org.testcontainers.reuse=true", "--filter", "until=2h", "-f") .inheritIO() .start() .waitFor(); context.getRoot().getStore(ExtensionContext.Namespace.GLOBAL).put("cleanupExecuted", true); } } }
- 在
src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension文件中新增上述扩展类的全限定名,完成全局注册即可。
额外原生配置优化
Testcontainers原生支持复用容器过期配置,你可以在~/.testcontainers.properties文件中添加如下配置,超过指定时长的容器会在下次测试启动时自动销毁重建:
testcontainers.reuse.expire-after = 2h
内容的提问来源于stack exchange,提问作者San Jaisy
相关产品推荐
相关产品推荐

