Не удается подключиться к док-контейнеру Cassandra в Scala Tests - PullRequest
0 голосов
/ 15 мая 2018

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

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


Я выбрал spotify/cassandra:latest image 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, ипо какой-то причине их нет, хотя конфигурация для них указана.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

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

docker-it-scala

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

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

testcontainers-scala

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

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

0 голосов
/ 01 марта 2019

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

override val container = CassandraContainer("spotify/cassandra:latest")
    .withExposedPorts(9042)
    .waitingFor(Wait.forListeningPort())
0 голосов
/ 15 мая 2018

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

В нем есть метод getContainerIpAddress, getMappedPort(9042) для получения фактического порта.Подробнее см. https://www.testcontainers.org/usage/generic_containers.html#accessing-a-container-from-tests.

...