testcontainers与Spring执行器

ipakzgxi  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(406)

我想在网络上运行带有testcontainers的容器。我的容器包含一个spring应用程序,它有一个执行器端点来表示它的状态,它处于:

/actuator/health

我的容器如下所示:

private final static Network network = Network.newNetwork();

private static final GenericContainer<?> myContainer = new GenericContainer<>("mycontainer:latest")
            .withExposedPorts(8443)
            .withNetwork(network)
            .withNetworkAliases("myContainer")
            .withClasspathResourceMapping("certs", "/app/certs", BindMode.READ_ONLY)
            .withClasspathResourceMapping("config", "/app/config", BindMode.READ_ONLY)
            .withLogConsumer(new Slf4jLogConsumer(log))
            .waitingFor(Wait.forHttp("/actuator/health").usingTls());

但是当我启动这个容器时,我得到以下错误:

Caused by: org.testcontainers.containers.ContainerLaunchException: Timed out waiting for URL to be accessible (https://localhost:33092/actuator/health should return HTTP [200])
    at org.testcontainers.containers.wait.strategy.HttpWaitStrategy.waitUntilReady(HttpWaitStrategy.java:214)
    at org.testcontainers.containers.wait.strategy.AbstractWaitStrategy.waitUntilReady(AbstractWaitStrategy.java:35)
    at org.testcontainers.containers.GenericContainer.waitUntilContainerStarted(GenericContainer.java:890)
    at org.testcontainers.containers.GenericContainer.tryStart(GenericContainer.java:441)
    ... 68 more

但是如果我 curl 这个url(在这个例子中: https://localhost:33092/actuator/health )在容器内的应用程序启动后,我正在等待评估,得到如下结果:

HTTP Status Code: 200
{
    "status": "UP"
}

我错过了什么?有什么想法吗?是虫子吗?

klr1opcd

klr1opcd1#

好吧,那你得把问题分解了。
我刚刚构建了一个带有依赖项的示例spring boot应用程序,并将其打包到一个映像中:

implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-web'

没别的,我从网上下载的https://start.spring.io/
以下测试类有效(我以您的代码为例):

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.output.Slf4jLogConsumer;
import org.testcontainers.containers.wait.strategy.Wait;

@Slf4j
public class TestcontainersWithSpringActuator {

    private static final GenericContainer<?> myContainer = new GenericContainer<>("docker.io/vcvitaly/test_sb:latest")
            .withExposedPorts(8080)
            .withNetworkAliases("myContainer")
            .withLogConsumer(new Slf4jLogConsumer(log))
            .waitingFor(Wait.forHttp("/actuator/health"));

    @Test
    void name() {
        myContainer.start();
        System.out.println();
    }
}

我也可以在system.out.println上暂停,而curl也可以工作

~  curl http://localhost:32776/actuator/health
{"status":"UP"}⏎

我现在真的没有一个直接的猜测在你的情况下发生了什么,但你必须分解你的问题一层一层(摆脱tls,网络等)或建立它从零开始与最简单的图像和添加功能一个接一个。

相关问题