HBase + TestContainers-端口重新映射

时间:2019-05-03 18:15:55

标签: docker hbase testcontainers

我正在尝试使用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为这种情况提供了另一种解决方案?

1 个答案:

答案 0 :(得分:1)

您可以看看KafkaContainer的实现,在该实现中,我们首先启动Socat(快速tcp代理)容器以获取一个半随机端口,然后使用它来配置目标容器。

算法是:

  1. doStart中,首先启动Socat,将原始容器的网络别名和端口定位为12345
  2. 获取映射端口(类似于32109指向12345)
  3. 让原始容器(例如带有环境变量)除使用原始端口外还使用映射的端口,或者,如果只能配置一个端口,请参见CouchbaseContainer了解更高级的选项
  4. 将Socat的主机和端口返回给客户端