等到容器在带有 GenericContainer 的 testcontainers 中启动以获取自定义 PostgreSQL 图像

Wait till container starts in testcontainers with GenericContainer for custom PostgreSQL image

我正在开发 system/integration 基于 Testcontainers 解决方案的测试。我需要使用我们自己的数据库 PostgreSQL 图像和已经应用的数据库模式。

出于这个原因,我正在使用 Testcontainers GenericContainer。

private static final GenericContainer postgresDb = new GenericContainer(POSTGRES_IMAGE).withExposedPorts(5432);

我正在使用 Spring Boot 开发测试,因此我创建了抽象 class 它将保存所有测试的配置

@ActiveProfiles("test")
@SpringBootTest
public abstract class AbstractTests {

    private static final DockerImageName POSTGRES_IMAGE = DockerImageName.parse("docker-name:latest");
    private static final GenericContainer postgresDb;

    static {
        postgresDb = new GenericContainer(POSTGRES_IMAGE)
            .withExposedPorts(5432);
        postgresDb.withStartupTimeout(Duration.ofSeconds(30))
            .start();
    }

    @DynamicPropertySource
    static void properties(DynamicPropertyRegistry registry) throws InterruptedException {
        final String s = "jdbc:postgresql://"+ postgresDb.getHost() +":"+ postgresDb.getMappedPort(5432) + "/test";
        registry.add("spring.datasource.url", () ->s);
    
    }

}

但是,问题是当测试 运行ning 时,容器仍在启动。这个 withStartupTimeout(Duration.ofSeconds(30)) 出于某种原因不起作用。

当我在属性方法中停止调试并花几秒钟时间启动容器时,所有测试都很好运行。

当测试失败时,我会看到下一条日志:

org.postgresql.util.PSQLException: FATAL: the database system is starting up

如果我输入 Thread.sleep(..) 它也有效,这不是更好的解决方案。

知道容器准备就绪的正确等待解决方案或正确策略是什么?

我认为答案在他们documentation中,尤其是这部分:

Log output Wait Strategy

In some situations a container's log output is a simple way to determine if it is ready or not. For example, we can wait for a `Ready' message in the container's logs as follows:

public GenericContainer containerWithLogWait = new GenericContainer(DockerImageName.parse("redis:5.0.3"))
    .withExposedPorts(6379)
    .waitingFor(
        Wait.forLogMessage(".*Ready to accept connections.*\n", 1)
    );

Note: you will want to change the message to something like:

".*database system is ready to accept connections.*"