Can';t连接到Scala测试中的Cassandra docker容器

Can';t连接到Scala测试中的Cassandra docker容器,scala,docker,scalatest,docker-java,testcontainers,Scala,Docker,Scalatest,Docker Java,Testcontainers,我非常渴望在Scala中建立docker测试 我在GitHub上创建了一个示例项目,以了解如何设置环境。可从以下网址获得: 我选择了spotify/cassandra:latestimage 因为我使用的是ScalaTest,所以我想使用一个Scala包装器,但两个都失败了 1. 容器定义为: val cassandraContainer: DockerContainer = DockerContainer("spotify/cassandra:latest") .

我非常渴望在Scala中建立docker测试

我在GitHub上创建了一个示例项目,以了解如何设置环境。可从以下网址获得:


我选择了
spotify/cassandra:latest
image

因为我使用的是ScalaTest,所以我想使用一个Scala包装器,但两个都失败了

1. 容器定义为:

val cassandraContainer: DockerContainer = DockerContainer("spotify/cassandra:latest")
    .withPorts(9042 -> None, 9060 -> None)
override val container = GenericContainer(
  "spotify/cassandra:latest",
  exposedPorts = Seq(9042, 9160)
) 
它是项目中的
CassandraDockerTest

2. 容器定义为:

val cassandraContainer: DockerContainer = DockerContainer("spotify/cassandra:latest")
    .withPorts(9042 -> None, 9060 -> None)
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
上可用,但由于某些原因,即使指定了它们的配置,它们也不可用


谢谢

选项2将使用Testcontainers。在Testcontainers中,端口被随机映射以避免冲突

其中有
getContainerIpAddress
getMappedPort(9042)
方法来获取实际端口。
有关详细信息,请参阅。

我已设法找到解决方案

docker it scala 工作容器定义

val cassandraContainer: DockerContainer = DockerContainer("spotify/cassandra:latest")
    .withPorts(9042 -> Some(9042), 9160 -> Some(9160))
    .withReadyChecker(DockerReadyChecker.LogLineContains("Listening for thrift clients"))
override val container = GenericContainer(
    "spotify/cassandra:latest",
    exposedPorts = Seq(9042, 9160),
    waitStrategy = new LogMessageContainsStrategy("Listening for thrift clients")
)
  • 要正确绑定端口,请使用(端口->部分(端口))
  • 必须等待容器启动(愚蠢的我)
  • testcontainers scala 工作容器定义

    val cassandraContainer: DockerContainer = DockerContainer("spotify/cassandra:latest")
        .withPorts(9042 -> Some(9042), 9160 -> Some(9160))
        .withReadyChecker(DockerReadyChecker.LogLineContains("Listening for thrift clients"))
    
    override val container = GenericContainer(
        "spotify/cassandra:latest",
        exposedPorts = Seq(9042, 9160),
        waitStrategy = new LogMessageContainsStrategy("Listening for thrift clients")
    )
    
  • testcontainers
    不允许定义端口重定向。相反 必须使用
    getMappedPort
    方法获取主机上的端口。谢谢@bsideup
  • 等待集装箱是必要的
    GitHub上提供了更详细的描述。也可以将其用作参考/示例

    现在(2019年3月)存在一个特定的Cassandra测试容器模块,您可以在此处获取其maven或gradle依赖项:。它可以这样使用:

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