Не удается подключиться к док-контейнеру Cassandra в Scala Tests

Я очень отчаянно пытаюсь настроить докер-тесты в Scala.

Я создал пример проекта на GitHub, чтобы понять, как мне настроить среду. Это доступно здесь: https://github.com/atais/sbt-scala-docker-cassandra


Я выбрал spotify/cassandra:latest изображение https://github.com/spotify/docker-cassandra.

Поскольку я использую ScalaTest, я хотел использовать одну из оболочек Scala, но обе мне не помогли.

1. https://github.com/whisklabs/docker-it-scala

Контейнер определяется как:

val cassandraContainer: DockerContainer = DockerContainer("spotify/cassandra:latest")
    .withPorts(9042 -> None, 9060 -> None)

это CassandraDockerTest в проекте.

2. https://github.com/testcontainers/testcontainers-scala

Контейнер определяется как:

override val container = GenericContainer(
  "spotify/cassandra:latest",
  exposedPorts = Seq(9042, 9160)
) 

это CassandraContainerTest в проекте.

Мое предположение

Кажется, что проблема (в обоих случаях) заключается в том, что контейнер запускается, но порты никогда не доступны:

CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                                                                                                                                                                                                   NAMES
7cb5fc91a97d        spotify/cassandra:latest   "cassandra-singlenode"   3 seconds ago       Up 2 seconds        0.0.0.0:33121->22/tcp, 0.0.0.0:33120->7000/tcp, 0.0.0.0:33119->7001/tcp, 0.0.0.0:33118->7199/tcp, 0.0.0.0:33117->8012/tcp, 0.0.0.0:33116->9042/tcp, 0.0.0.0:33115->9160/tcp, 0.0.0.0:33114->61621/tcp   quirky_chandrasekhar

И я хотел бы 9042 а также 9160 быть доступным на 0.0.0.0и по какой-то причине их нет, хотя конфигурация для них указана.

Спасибо!

2 ответа

Решение

Мне удалось найти решение (я)

докер-он-Скала

Определение рабочего контейнера

val cassandraContainer: DockerContainer = DockerContainer("spotify/cassandra:latest")
    .withPorts(9042 -> Some(9042), 9160 -> Some(9160))
    .withReadyChecker(DockerReadyChecker.LogLineContains("Listening for thrift clients"))
  1. Чтобы правильно связать порты (Порт -> Некоторые (Порт))
  2. Надо дождаться запуска контейнера (глупый я)

testcontainers-Скала

Определение рабочего контейнера

override val container = GenericContainer(
    "spotify/cassandra:latest",
    exposedPorts = Seq(9042, 9160),
    waitStrategy = new LogMessageContainsStrategy("Listening for thrift clients")
)
  1. testcontainers не позволяйте определять перенаправление портов. Вместо этого нужно использовать getMappedPort способ получить порт на хосте. Спасибо @bsideup
  2. Подождать контейнер необходимо.

Более подробное описание доступно на GitHub. Также можно использовать это как ссылку / пример. https://github.com/atais/sbt-scala-docker-cassandra

Сейчас (март 2019 г.) существует специальный тестовый контейнерный модуль Cassandra, и вы можете получить его зависимость от maven или gradle здесь: https://www.testcontainers.org/modules/databases/cassandra/. И это можно использовать так:

override val container = CassandraContainer("spotify/cassandra:latest")
    .withExposedPorts(9042)
    .waitingFor(Wait.forListeningPort())

Вариант № 2 будет использовать Testcontainers. В Testcontainers порты отображаются случайным образом, чтобы избежать конфликтов.

Есть getContainerIpAddress, getMappedPort(9042) метод в нем, чтобы получить фактический порт. См. https://www.testcontainers.org/usage/generic_containers.html для получения подробной информации.

Другие вопросы по тегам