TestContainer 由于错误而无法启动:等待日志输出匹配超时

Abe*_*Abe 10 elasticsearch spring-boot-test testcontainers testcontainers-junit5

在为elasticserach启动testcontainer时,出现“ContainerLaunchException:等待日志输出匹配超时”。我应该如何解决这个问题?

container = new ElasticsearchContainer(ELASTICSEARCH_IMAGE)
            .withEnv("discovery.type", "single-node")
            .withExposedPorts(9200);

    container.start();
Run Code Online (Sandbox Code Playgroud)

12:16:50.370 [主要]错误[docker.elastic.co/elasticsearch/elasticsearch:7.16.3] - 无法启动容器org.testcontainers.containers.ContainerLaunchException:等待日志输出匹配'超时。(“消息”:\ s?“开始”。 |]开始$)'在org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy.waitUntilReady(LogMessageWaitStrategy.java:49)在org.testcontainers.containers.wait.strategy。 AbstractWaitStrategy.waitUntilReady(AbstractWaitStrategy.java:51)

更新:我研究了构造函数 ElasticsearchContainer

    public ElasticsearchContainer(DockerImageName dockerImageName) {
    super(dockerImageName);
    this.caCertAsBytes = Optional.empty();
    dockerImageName.assertCompatibleWith(new DockerImageName[]{DEFAULT_IMAGE_NAME, DEFAULT_OSS_IMAGE_NAME});
    this.isOss = dockerImageName.isCompatibleWith(DEFAULT_OSS_IMAGE_NAME);
    this.logger().info("Starting an elasticsearch container using [{}]", dockerImageName);
    this.withNetworkAliases(new String[]{"elasticsearch-" + Base58.randomString(6)});
    this.withEnv("discovery.type", "single-node");
    this.addExposedPorts(new int[]{9200, 9300});
    this.isAtLeastMajorVersion8 = (new ComparableVersion(dockerImageName.getVersionPart())).isGreaterThanOrEqualTo("8.0.0");
    String regex = ".*(\"message\":\\s?\"started\".*|] started\n$)";
    this.setWaitStrategy((new LogMessageWaitStrategy()).withRegEx(regex));
    if (this.isAtLeastMajorVersion8) {
        this.withPassword("changeme");
    }

}
Run Code Online (Sandbox Code Playgroud)

它使用 setWaitStrategy。所以我更新了我的代码如下

container.setWaitStrategy((new LogMessageWaitStrategy()).withRegEx(regex).withTimes(1));
Run Code Online (Sandbox Code Playgroud)

但我仍然遇到同样的错误。这是日志消息的发送范围。

在此输入图像描述

再次更新:我意识到上面的代码更改不会更新任何默认值。

这是新的变化:

        container.setWaitStrategy((new LogMessageWaitStrategy())
                        .withRegEx(regex)
                        .withStartupTimeout(Duration.ofSeconds(180L)));
Run Code Online (Sandbox Code Playgroud)

它适用于这个新的变化。我必须从 ElasticsearchContainer 构造函数复制正则表达式。我希望它有更好的方法来覆盖超时值。

naX*_*aXa 0

添加withStartupTimeout

String regex = ".*(\"message\":\\s?\"started\".*|] started\n$)";
container.setWaitStrategy((new LogMessageWaitStrategy())
    .withRegEx(regex)
    .withStartupTimeout(Duration.ofMinutes(3)));
Run Code Online (Sandbox Code Playgroud)

调整“持续时间”以适合您期望的容器启动时间。这在由于资源有限或网络延迟等各种原因而启动时间可能较长的环境中特别有用。