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

如何在Quarkus中为Testcontainers设置TMPFS内存文件系统

解决方案

下面是三种经过验证的可行绕过方案,可根据你的项目需求选择:

方案1:使用DevServices自定义配置器(推荐)

Quarkus 2.8及以上版本提供了Dev Services容器的自定义扩展入口,不需要修改原有测试逻辑,也不用关闭自动Dev Services功能,直接修改容器启动参数即可:

  1. 在测试源码目录下新增配置自定义类:
import io.quarkus.datasource.devservices.DevServicesDatasourceConfigCustomizer;
import io.quarkus.arc.Unremovable;
import jakarta.enterprise.context.ApplicationScoped;
import org.testcontainers.containers.JdbcDatabaseContainer;
import org.testcontainers.containers.PostgreSQLContainer;
import java.util.Map;

@Unremovable
@ApplicationScoped
public class TmpfsDatabaseConfigCustomizer implements DevServicesDatasourceConfigCustomizer {

    @Override
    public void customize(JdbcDatabaseContainer<?> container) {
        // 匹配对应数据库容器类型,可根据你的实际使用的数据库调整
        if (container instanceof PostgreSQLContainer) {
            // 第一个参数为数据库镜像的数据存储目录,不同数据库对应路径不同
            // PostgreSQL对应/var/lib/postgresql/data,MySQL对应/var/lib/mysql
            container.withTmpFs(Map.of(
                "/var/lib/postgresql/data", "rw,noexec,nosuid"
            ));
        }
    }
}

Quarkus测试启动时会自动扫描加载该类,直接生效。

方案2:手动管理Testcontainers容器

如果需要更高的配置灵活度,或者使用的Quarkus版本低于2.8,可以选择关闭自动Dev Services,自行初始化容器:

  1. 在test/resources/application.properties中关闭对应数据源的自动Dev Services:
quarkus.datasource.devservices.enabled=false
  1. 新增测试资源类管理容器生命周期:
import io.quarkus.test.common.QuarkusTestResourceLifecycleManager;
import org.testcontainers.containers.PostgreSQLContainer;
import java.util.Map;

public class TmpfsPostgresResource implements QuarkusTestResourceLifecycleManager {

    private PostgreSQLContainer<?> container;

    @Override
    public Map<String, String> start() {
        container = new PostgreSQLContainer<>("postgres:15-alpine")
                // 配置TMPFS挂载
                .withTmpFs(Map.of("/var/lib/postgresql/data", "rw"));
        container.start();
        // 将容器连接参数返回给Quarkus注入数据源
        return Map.of(
                "quarkus.datasource.jdbc.url", container.getJdbcUrl(),
                "quarkus.datasource.username", container.getUsername(),
                "quarkus.datasource.password", container.getPassword()
        );
    }

    @Override
    public void stop() {
        if (container != null) {
            container.stop();
        }
    }
}
  1. 在需要使用该容器的测试类上添加注解启用:
import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.junit.QuarkusTest;

@QuarkusTest
@QuarkusTestResource(TmpfsPostgresResource.class)
public class YourIntegrationTest {
    // 测试代码
}

方案3:全局配置所有同类容器参数

如果所有集成测试用的数据库都需要启用TMPFS,可以通过Testcontainers的容器自定义扩展全局配置,不过该方案对所有同类型容器生效,灵活度较低,适合统一测试环境的场景。


内容的提问来源于stack exchange,提问作者Arthur Klezovich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:45:03