带弹簧执行器的测试容器

Fiv*_*ive 6 java docker spring-boot testcontainers

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

/actuator/health
Run Code Online (Sandbox Code Playgroud)

我的容器如下所示:

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());
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

但是,如果我在https://localhost:33092/actuator/health容器内的应用程序启动后但正在等待评估时卷曲此网址(在本例中:),我会得到如下内容:

HTTP Status Code: 200
{
    "status": "UP"
}
Run Code Online (Sandbox Code Playgroud)

我缺少什么?有任何想法吗?这是一个错误吗?

Vit*_*ura 0

好的,所以你必须分解问题。

\n

我刚刚构建了一个带有依赖项的示例 Spring Boot 应用程序,并将其打包在图像中:

\n
implementation \'org.springframework.boot:spring-boot-starter-actuator\'\nimplementation \'org.springframework.boot:spring-boot-starter-web\'\n
Run Code Online (Sandbox Code Playgroud)\n

没别的了,我从https://start.spring.io/下载的

\n

以下测试类有效(我以您的代码为例):

\n
import lombok.extern.slf4j.Slf4j;\nimport org.junit.jupiter.api.Test;\nimport org.testcontainers.containers.GenericContainer;\nimport org.testcontainers.containers.output.Slf4jLogConsumer;\nimport org.testcontainers.containers.wait.strategy.Wait;\n\n@Slf4j\npublic class TestcontainersWithSpringActuator {\n\n    private static final GenericContainer<?> myContainer = new GenericContainer<>("docker.io/vcvitaly/test_sb:latest")\n            .withExposedPorts(8080)\n            .withNetworkAliases("myContainer")\n            .withLogConsumer(new Slf4jLogConsumer(log))\n            .waitingFor(Wait.forHttp("/actuator/health"));\n\n    @Test\n    void name() {\n        myContainer.start();\n        System.out.println();\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我还可以在 System.out.println 上休息一下,虽然它暂停了,但卷曲也可以工作

\n
~  curl http://localhost:32776/actuator/health\n{"status":"UP"}\xe2\x8f\x8e\n
Run Code Online (Sandbox Code Playgroud)\n

我现在并没有直接猜测你的情况发生了什么,但你必须逐层分解你的问题(摆脱 tls、网络等),或者用最简单的从头开始构建它图像并一一添加功能。

\n