【问题标题】:Can't connect to Cassandra docker container in Scala Tests无法连接到 Scala 测试中的 Cassandra docker 容器
【发布时间】:2018-10-25 08:28:50
【问题描述】:

我非常拼命地尝试在 Scala 中设置 docker 测试。

我在 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

我希望 904291600.0.0.0 上可用,但由于某种原因,它们不可用,即使指定了它们的配置。

谢谢!

【问题讨论】:

    标签: scala docker scalatest docker-java testcontainers


    【解决方案1】:

    我已经设法找到解决方案

    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. 要正确绑定端口,请使用 (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

    【讨论】:

      【解决方案2】:

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

      里面有getContainerIpAddress,getMappedPort(9042)方法来获取实际的端口。 详情请见https://www.testcontainers.org/usage/generic_containers.html#accessing-a-container-from-tests

      【讨论】:

        【解决方案3】:

        现在(2019 年 3 月)存在一个特定的 Cassandra 测试容器模块,您可以在此处获取其 maven 或 gradle 依赖项:https://www.testcontainers.org/modules/databases/cassandra/。并且可以这样使用:

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

        【讨论】:

          猜你喜欢
          • 2017-10-05
          • 2016-05-30
          • 2015-05-01
          • 1970-01-01
          • 2020-02-29
          • 2018-10-20
          • 2017-09-08
          • 2016-03-02
          • 2017-08-21
          相关资源
          最近更新 更多