HBase + TestContainers — переназначение портов

Я пытаюсь использовать тестовые контейнеры для запуска интеграционного теста с HBase, запущенным в контейнере Docker. Проблема, с которой я сталкиваюсь, может быть немного уникальной для того, как клиент взаимодействует с HBase.

Когда мастер HBase запускается в контейнере, он сохраняет свое имя хоста: порт в Zookeeper, чтобы клиенты могли его найти. В этом случае он хранит «localhost: 16000».

В моем тестовом примере, запущенном вне контейнера, клиент получает «localhost: 16000» из Zookeeper и не может подключиться. Соединение завершается сбоем, потому что порт был переназначен TestContainers на какой-то другой случайный порт, отличный от 16000.

Любые идеи, как это преодолеть?

(1) Одна из идей состоит в том, чтобы найти способ указать клиенту HBase использовать переназначенный порт, игнорируя значение, полученное от Zookeeper, но мне еще предстоит найти способ сделать это.

(2) Если бы я мог заставить HBase Master записать внешне доступный хост: порт в Zookeeper, это также решило бы проблему. Но я не верю, что сам контейнер знает, как Test Containers выполняет переназначение портов.

(3) Возможно, Test Containers предлагает другое решение для подобных ситуаций?


person Nick Allen    schedule 03.05.2019    source источник


Ответы (1)


Вы можете взглянуть на KafkaContainer, в которой мы сначала запускаем контейнер Socat (быстрый прокси-сервер tcp), чтобы получить полуслучайный порт, а затем использовать его для настройки целевого контейнера.

Алгоритм:

  1. В doStart сначала запустите Socat, ориентируясь на сетевой псевдоним и порт исходного контейнера, например 12345.
  2. Получите сопоставленный порт (это будет что-то вроде 32109, указывающего на 12345)
  3. Заставьте исходный контейнер (например, с переменными среды) использовать сопоставленный порт в дополнение к исходному или, если можно настроить только один порт, см. CouchbaseContainer для более продвинутого варианта
  4. Вернуть хост и порт Socat клиенту
person bsideup    schedule 03.05.2019