Testcontainer无法配置端口绑定,WireMock固定8081端口映射失败如何解决?
问题根因
- 暴露端口配置错误:WireMock容器内部默认监听
8080端口,你在withExposedPorts中传入了8081,但容器内部根本没有服务监听这个端口,会直接导致同网络容器访问8081被拒绝、等待8081端口超时的问题。 - 端口绑定逻辑被覆盖:Testcontainer 1.15.x版本存在默认逻辑,会自动覆盖通过
withCreateContainerCmdModifier配置的端口绑定规则,优先生成随机端口映射,这是你得到随机端口的核心原因。 - 容器网络访问逻辑错误:同网络下的容器互相访问走的是容器内部端口,不是宿主机映射端口,你尝试访问
http://wiremock:8081本身就是错误的,正确的容器网络内部访问端口应该是8080。
修复方案
如果你需要宿主机通过8081访问WireMock,同时同网络容器通过固定端口访问,可使用如下代码配置:
public WiremockContainer() { super("wiremock/wiremock:2.9.0-alpine"); self() .waitingFor(Wait.forLogMessage(".*port:\\s*8080.*", 1) .withStartupTimeout(Duration.ofSeconds(25L))) // 暴露容器内部的8080端口 .addExposedPort(8080) // 直接设置端口绑定,不会被Testcontainer默认逻辑覆盖 .setPortBindings(Collections.singletonList("8081:8080")) .withNetworkAliases("wiremock"); }
访问规则说明
- 宿主机访问WireMock:使用
http://localhost:8081 - 同网络下的其他容器访问WireMock:使用
http://wiremock:8080
注意事项
- 配置固定端口前需确认宿主机
8081端口未被其他进程占用,否则会启动失败 - 如果仅需同网络容器访问固定端口,不需要映射宿主机端口,直接使用
http://wiremock:8080访问即可,无需额外配置端口绑定
内容的提问来源于stack exchange,提问作者Filip Kowalski
相关产品推荐
相关产品推荐

