测试容器 - 无法连接到通用容器的公开端口
testcontainers - cannot connect to exposed port of generic container
我正在尝试使用 GenericContainer 启动自定义 docker 容器。
启动容器后,我想从测试 class 执行一个 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();
}
}
其他详细信息:
- lsof -i :9000 在我的本地机器上没有显示任何绑定端口
- waitForHttpPort 的等待策略不起作用(容器启动超时)
如能帮助我找出原因,我将不胜感激。
如果说testcontainers暴露9000端口,意思是将容器内部的9000端口绑定到本地机器上的某个空闲端口,并不意味着本地9000端口绑定了什么。
你可以询问容器暴露的容器端口绑定到本地哪个端口(例如containerinstance.getMappedPort(9000)
如果您的客户端不在容器中,它必须连接到本地端口。如果它在容器内(或同一 docker 网络中的任何容器),请使用端口 9000。
我正在尝试使用 GenericContainer 启动自定义 docker 容器。 启动容器后,我想从测试 class 执行一个 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();
}
}
其他详细信息:
- lsof -i :9000 在我的本地机器上没有显示任何绑定端口
- waitForHttpPort 的等待策略不起作用(容器启动超时)
如能帮助我找出原因,我将不胜感激。
如果说testcontainers暴露9000端口,意思是将容器内部的9000端口绑定到本地机器上的某个空闲端口,并不意味着本地9000端口绑定了什么。
你可以询问容器暴露的容器端口绑定到本地哪个端口(例如containerinstance.getMappedPort(9000)
如果您的客户端不在容器中,它必须连接到本地端口。如果它在容器内(或同一 docker 网络中的任何容器),请使用端口 9000。