代码之家  ›  专栏  ›  技术社区  ›  Atais

无法连接到Scala测试中的Cassandra docker容器

  •  3
  • Atais  · 技术社区  · 6 年前

    我非常渴望在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
    

    我想 9042 9160 将于上提供 0.0.0.0 ,并且由于某些原因,即使指定了它们的配置,它们也不是。

    谢谢

    3 回复  |  直到 4 年前
        1
  •  4
  •   Atais    6 年前

    我已设法找到解决方案

    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
  •   bsideup    6 年前

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

    getContainerIpAddress ,则, getMappedPort(9042) 方法获取实际端口。 看见 https://www.testcontainers.org/usage/generic_containers.html#accessing-a-container-from-tests 有关详细信息。

        3
  •  2
  •   jcflorezr    5 年前

    现在(2019年3月)存在一个特定的Cassandra测试容器模块,您可以在这里获得其maven或gradle依赖关系: https://www.testcontainers.org/modules/databases/cassandra/ .它可以这样使用:

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