testcontainers - 无法连接到通用容器的暴露端口

3

我正在尝试使用GenericContainer启动自定义的docker容器。 一旦容器启动,我想从测试类中执行一个HTTP请求。 我看到了这个错误:

INFO: Exposed ports: 9000

java.net.ConnectException: Failed to connect to localhost/0:0:0:0:0:0:0:1:9000
    at org.testcontainers.shaded.okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:265)

Caused by: java.net.ConnectException: Connection refused (Connection refused)
    at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)


端口似乎已经被绑定:
docker ps -a
CONTAINER ID   IMAGE                                            COMMAND                  CREATED              STATUS              PORTS                                                                                      NAMES
f311467dbd25   foo.bar.com/abc-def/testcontainer:4.30.65   "/bin/sh -c 'exec /o…"   About a minute ago   Up About a minute   0.0.0.0:55164->9000/tcp, :::55164->9000/tcp, 0.0.0.0:55163->9001/tcp, :::55163->9001/tcp   happy_jepsen

我用以下代码创建容器:

        myContainerInstance = new GenericContainer<>(MY_CONTAINER_IMAGE)
                .withNetworkAliases("foo")
                .withCreateContainerCmdModifier(createContainerCmd -> createContainerCmd.withHostName("foo"))
                .waitingFor(new WaitAllStrategy().withStrategy(new LogMessageWaitStrategy().withRegEx(".*Listening for HTTP on.*"))
                        .withStartupTimeout(Duration.ofMinutes(4)))
                .withExposedPorts(9000)

客户端代码:
    OkHttpClient client = new OkHttpClient();
        String url = "http://localhost:9000/testget";
        String output = run(url);
        logger.info("Response is: " + output);

    }
    String run(String url) throws IOException {
        Request request = new Request.Builder()
                .url(url)
                .addHeader("Content-type", "application/json")
                .build();

        try (Response response = client.newCall(request).execute()) {
            return response.body().string();
        }
    }

更多细节:

  1. 在我的本地机器上,lsof -i :9000没有显示任何已绑定的端口。
  2. waitForHttpPort的等待策略不起作用(容器启动超时)。

我希望能得到任何有关原因的帮助。

1个回答

5

如果你使用testcontainers来暴露端口9000,那意味着在容器内将端口9000绑定到本地机器上的某个空闲端口,并不意味着本地端口9000被绑定到了某个东西。

你可以询问容器将暴露的容器端口绑定到了哪个本地端口(例如,containerinstance.getMappedPort(9000))

如果你的客户端不在容器内,它必须连接到本地端口。如果它在容器内(或任何在同一docker网络中的容器中),则使用端口9000。


mappedPort不同,并打印为55123。然而,当我尝试使用浏览器访问http://localhost:55123/testget时,它没有响应。还有其他需要做的事情吗?我也没有看到任何请求到达容器(我在那里记录日志)。 - truthSeekr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接