无法连接到 Scala 测试中的 Cassandra docker 容器
Can't connect to Cassandra docker container in Scala Tests
我非常拼命地尝试在 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
上可用,但由于某些原因,它们不是,即使指定了它们的配置。
谢谢!
选项 2 将使用测试容器。在 Testcontainer 中,端口是随机映射的,以避免冲突。
其中有getContainerIpAddress
、getMappedPort(9042)
方法获取实际端口。
详情请参阅 https://www.testcontainers.org/usage/generic_containers.html#accessing-a-container-from-tests。
我已经设法找到解决方案
docker-it-scala
工作容器定义
val cassandraContainer: DockerContainer = DockerContainer("spotify/cassandra:latest")
.withPorts(9042 -> Some(9042), 9160 -> Some(9160))
.withReadyChecker(DockerReadyChecker.LogLineContains("Listening for thrift clients"))
- 要正确绑定端口,请使用 (Port -> Some(Port))
- 需要等待容器启动(傻我)
testcontainers-scala
工作容器定义
override val container = GenericContainer(
"spotify/cassandra:latest",
exposedPorts = Seq(9042, 9160),
waitStrategy = new LogMessageContainsStrategy("Listening for thrift clients")
)
testcontainers
不允许定义端口重定向。反而,
必须使用 getMappedPort
方法来获取主机上的端口。谢谢@bsideup
- 需要等待容器。
GitHub 上提供了更详细的说明。也可以将其用作 reference/example。 https://github.com/atais/sbt-scala-docker-cassandra
现在(2019 年 3 月)存在一个特定的 Cassandra 测试容器模块,您可以在此处获取其 Maven 或 gradle 依赖项:https://www.testcontainers.org/modules/databases/cassandra/。它可以这样使用:
override val container = CassandraContainer("spotify/cassandra:latest")
.withExposedPorts(9042)
.waitingFor(Wait.forListeningPort())
我非常拼命地尝试在 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
上可用,但由于某些原因,它们不是,即使指定了它们的配置。
谢谢!
选项 2 将使用测试容器。在 Testcontainer 中,端口是随机映射的,以避免冲突。
其中有getContainerIpAddress
、getMappedPort(9042)
方法获取实际端口。
详情请参阅 https://www.testcontainers.org/usage/generic_containers.html#accessing-a-container-from-tests。
我已经设法找到解决方案
docker-it-scala
工作容器定义
val cassandraContainer: DockerContainer = DockerContainer("spotify/cassandra:latest")
.withPorts(9042 -> Some(9042), 9160 -> Some(9160))
.withReadyChecker(DockerReadyChecker.LogLineContains("Listening for thrift clients"))
- 要正确绑定端口,请使用 (Port -> Some(Port))
- 需要等待容器启动(傻我)
testcontainers-scala
工作容器定义
override val container = GenericContainer(
"spotify/cassandra:latest",
exposedPorts = Seq(9042, 9160),
waitStrategy = new LogMessageContainsStrategy("Listening for thrift clients")
)
testcontainers
不允许定义端口重定向。反而, 必须使用getMappedPort
方法来获取主机上的端口。谢谢@bsideup- 需要等待容器。
GitHub 上提供了更详细的说明。也可以将其用作 reference/example。 https://github.com/atais/sbt-scala-docker-cassandra
现在(2019 年 3 月)存在一个特定的 Cassandra 测试容器模块,您可以在此处获取其 Maven 或 gradle 依赖项:https://www.testcontainers.org/modules/databases/cassandra/。它可以这样使用:
override val container = CassandraContainer("spotify/cassandra:latest")
.withExposedPorts(9042)
.waitingFor(Wait.forListeningPort())