我正在尝试使用Test Containers对在Docker容器中启动的HBase运行集成测试。我遇到的问题对于客户端与HBase的交互方式可能有点独特。
当HBase Master在容器中启动时,它将其hostname:port存储在Zookeeper中,以便客户端可以找到它。在这种情况下,它将存储“ localhost:16000”。
在我的在容器外部运行的测试用例中,客户端从Zookeeper检索“ localhost:16000”,并且无法连接。连接失败,因为该端口已被TestContainers重新映射到其他随机端口,而不是16000。
有什么办法可以克服这个问题吗?
(1)一个想法是找到一种方法,让HBase Client使用重新映射的端口,而忽略从Zookeeper检索到的值,但是我还没有找到一种方法来做到这一点。
(2)如果我可以让HBase Master在Zookeeper中编写外部可访问的host:port,这也可以解决该问题。但是我不相信容器本身对测试容器如何进行端口重新映射一无所知。
(3)也许Test Containers为这种情况提供了另一种解决方案?
答案 0 :(得分:1)
您可以看看KafkaContainer的实现,在该实现中,我们首先启动Socat(快速tcp代理)容器以获取一个半随机端口,然后使用它来配置目标容器。
算法是:
doStart
中,首先启动Socat,将原始容器的网络别名和端口定位为12345