当前位置: 首页 > 知识库问答 >
问题:

在testcontainers中使用GenericContainer启动容器以获得自定义PostgreSQL映像

戴品
2023-03-14
private static final GenericContainer postgresDb = new GenericContainer(POSTGRES_IMAGE).withExposedPorts(5432);
@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);
    
    }

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

如果我把thread.sleep(..)它也有效,但不是更好的解决方案。

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

共有1个答案

翟卓君
2023-03-14

我认为答案就在他们的文档中,尤其是这一部分:

在某些情况下,容器的日志输出是确定它是否准备好的一种简单方法。例如,我们可以在容器的日志中等待“就绪”消息,如下所示:

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

注意:您希望将消息更改为以下内容:

 类似资料:
  • 因为使用com.mysql.jdbc.driver的MySQLContainer不推荐使用。我的测试(例如) 而我却撞到了墙上。如果我使用mvn测试,我看到(通过docker ps)容器启动了。它开始了两三次(映射在随机端口上,如328xx),但maven告诉 我现在该怎么办?如何告诉我的testcontainer需要的端口(6161)?如何使用application.properties中的参数

  • 我正在使用Docker Agents的Jenkins声明式管道来构建和测试我的软件,包括使用测试容器运行集成测试。我可以在我的开发环境中运行测试容器测试(不使用Jenkins),但它们在Jenkins下会失败。 testcontainers Ryuk资源获取守护程序不工作 我可以通过将环境变量设置为true来禁用守护进程来解决这个问题。但是,一些集成测试仍然一再失败。 使用Elasticsearc

  • 问题内容: 鉴于: 基于ubuntu的容器:13.10 已安装ssh(通过) 问题:每次启动容器时,我都必须手动运行sshd 尝试过:,但无济于事。 问题:如何设置容器以在容器启动期间自动启动sshd服务? 问题答案: 您可以尝试使用phusion / baseimage-docker实现更优雅的方式 https://github.com/phusion/baseimage- docker#rea

  • 给定: 基于Ubuntu:13.10的容器 已安装ssh(通过)

  • 我正在开发一个Spring启动自定义启动器,其中pom包含一些依赖项(其他启动器、库),并且这个启动器执行一些关于jwt过滤的配置,以允许过滤器处于安全水位。问题是当我在另一个项目(starter-消费者)中添加我的自定义启动器作为pom依赖项时,它似乎检测到我要导入的类,但IntelliJ什么也没做。 也许我没有正确打包启动器,或者至少我在里面编码的类。启动器在pom中包含的其他依赖项被成功添加

  • 我想在play应用程序(使用slick)启动之前,从docker compose文件(postgres和kafka实例)启动testcontainers。我想要这个,这样我就可以写一个端到端的测试。我似乎不明白这是怎么可能的。 Scala版本2.12.10 Testcontainer版本0.35.0 Play slick版本5.0.0 当我在没有“TestFunSpec”的情况下执行测试时,doc