Не удается подключиться к док-контейнеру 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"))
- Чтобы правильно связать порты (Порт -> Некоторые (Порт))
- Надо дождаться запуска контейнера (глупый я)
testcontainers-Скала
Определение рабочего контейнера
override val container = GenericContainer(
"spotify/cassandra:latest",
exposedPorts = Seq(9042, 9160),
waitStrategy = new LogMessageContainsStrategy("Listening for thrift clients")
)
testcontainers
не позволяйте определять перенаправление портов. Вместо этого нужно использоватьgetMappedPort
способ получить порт на хосте. Спасибо @bsideup- Подождать контейнер необходимо.
Более подробное описание доступно на 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 для получения подробной информации.