我非常想在Scala中设置docker测试。
我在GitHub上创建了一个示例项目,以了解我应该如何设置环境。它可以在这里找到:https://github.com/atais/sbt-scala-docker-cassandra
我选择了spotify/cassandra:latest
图片https://github.com/spotify/docker-cassandra。
由于我使用的是ScalaTest,我想使用其中一个Scala包装器,但两者都失败了。
容器定义为:
val cassandraContainer: DockerContainer = DockerContainer("spotify/cassandra:latest")
.withPorts(9042 -> None, 9060 -> None)
项目中CassandraDockerTest
。
容器定义为:
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
上可用,并且出于某种原因,它们不是,即使指定了它们的配置。
谢谢!
答案 0 :(得分:2)
选项号2将使用Testcontainers。在Testcontainers中,端口随机映射以避免冲突。
其中有getContainerIpAddress
,getMappedPort(9042)
方法来获取实际端口。
有关详细信息,请参阅https://www.testcontainers.org/usage/generic_containers.html#accessing-a-container-from-tests。
答案 1 :(得分:2)
我设法找到了解决方案
工作容器定义
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上有更详细的说明。也可以使用它作为参考/示例。 https://github.com/atais/sbt-scala-docker-cassandra
答案 2 :(得分:0)
现在(2019年3月)存在一个特定的Cassandra测试容器模块,您可以在这里获取其maven或gradle依赖性:https://www.testcontainers.org/modules/databases/cassandra/。可以这样使用:
override val container = CassandraContainer("spotify/cassandra:latest")
.withExposedPorts(9042)
.waitingFor(Wait.forListeningPort())