在 spock 测试中获取对默认 java 容器 (TestContainers) 的访问权限

Get the access to default java container (TestContainers) in spock test

我有一个启动附加容器的 spock 集成测试。

@Shared
protected GenericContainer seleniumStandalone =
        new GenericContainer<>("selenium/standalone-chrome:latest")
                .withExposedPorts(4444)
                .withCreateContainerCmdModifier({ cmd -> cmd.withName('dockerized-chrome') })
                .withCopyFileToContainer(
                        MountableFile.forClasspathResource("install_python.sh", 0744),"/install_python.sh")
                .withCopyFileToContainer(
                        MountableFile.forClasspathResource("test.py", 0744),"/test.py")

容器“dockerized-chrome”有一个 python 脚本。他内部的脚本正试图向最初在 java 源代码中的端点发出请求。这就是为什么我很好奇有什么方法可以获取有关名称或 ID java 容器的信息,这些容器是由 TestContainers 注释创建的,该注释还具有在 java 项目中创建的端点。 为了更清楚,我加了一张图。

如果你想用 Testcontainer 在两个容器之间进行通信,请确保将它们放在同一个网络中。

您可以为每个容器添加一个网络别名,以避免通过主机进行任何 IP 查找和端口暴露。

以下示例来自 Testcontainers 文档和 dedicated section for Advanced Networking:

的一部分
try (
        Network network = Network.newNetwork();

        GenericContainer<?> foo = new GenericContainer<>(TestImages.TINY_IMAGE)
                .withNetwork(network)
                .withNetworkAliases("foo")
                .withCommand("/bin/sh", "-c", "while true ; do printf 'HTTP/1.1 200 OK\n\nyay' | nc -l -p 8080; done");

        GenericContainer<?> bar = new GenericContainer<>(TestImages.TINY_IMAGE)
                .withNetwork(network)
                .withCommand("top")
) {
    foo.start();
    bar.start();

    String response = bar.execInContainer("wget", "-O", "-", "http://foo:8080").getStdout();
    assertEquals("received response", "yay", response);
}

将其用作您的设置蓝图并命名您的 Java 容器,例如application。接下来,您可以从您的 Selenium 容器和 Python 脚本中使用 http://application:YOUR_DEFAULT_PORT.

访问此容器