等到容器在带有 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.*"
我正在开发 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.*"