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

时间:2021-06-24 05:30:41

标签: java docker junit dockerfile testcontainers

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

return view('items')->compact('all_items');

端口似乎被绑定了:

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)

其他详细信息:

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

如果您能帮助我找出原因,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

如果你说 testcontainers 暴露 9000 端口,这意味着将容器内的 9000 端口绑定到本地机器上的某个空闲端口,这并不意味着本地端口 9000 绑定到某些东西。

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

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

相关问题