Skip to content

Commit ffd7a06

Browse files
committed
hostconfig with tmpfs
1 parent 2a51040 commit ffd7a06

File tree

7 files changed

+63
-50
lines changed

7 files changed

+63
-50
lines changed

core/src/main/scala/com/whisk/docker/DockerContainer.scala

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ case class LogLineReceiver(withErr: Boolean, f: String => Unit)
1010

1111
case class DockerPortMapping(hostPort: Option[Int] = None, address: String = "0.0.0.0")
1212

13+
case class HostConfig(
14+
tmpfs: Option[Map[String, String]] = None
15+
)
16+
1317
case class DockerContainer(image: String,
1418
name: Option[String] = None,
1519
command: Option[Seq[String]] = None,
@@ -24,7 +28,8 @@ case class DockerContainer(image: String,
2428
volumeMappings: Seq[VolumeMapping] = Seq.empty,
2529
logLineReceiver: Option[LogLineReceiver] = None,
2630
user: Option[String] = None,
27-
hostname: Option[String] = None) {
31+
hostname: Option[String] = None,
32+
hostConfig: Option[HostConfig] = None) {
2833

2934
def withCommand(cmd: String*) = copy(command = Some(cmd))
3035

@@ -54,4 +59,6 @@ case class DockerContainer(image: String,
5459
def withUser(user: String) = copy(user = Some(user))
5560

5661
def withHostname(hostname: String) = copy(hostname = Some(hostname))
62+
63+
def withHostConfig(hostConfig: HostConfig) = copy(hostConfig = Some(hostConfig))
5764
}

core/src/main/scala/com/whisk/docker/DockerContainerManager.scala

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,17 @@ class DockerContainerManager(containers: Seq[DockerContainer], executor: DockerC
4141

4242
@tailrec
4343
def initGraph(graph: ContainerDependencyGraph,
44-
previousInits: Future[Seq[DockerContainerState]] = Future.successful(Seq.empty)
45-
): Future[Seq[DockerContainerState]] = {
44+
previousInits: Future[Seq[DockerContainerState]] = Future.successful(Seq.empty))
45+
: Future[Seq[DockerContainerState]] = {
4646
val initializedContainers = previousInits.flatMap { prev =>
4747
Future.traverse(graph.containers.map(dockerStatesMap))(_.init()).map(prev ++ _)
4848
}
4949

5050
graph.dependants match {
5151
case None => initializedContainers
5252
case Some(dependants) =>
53-
val readyInits: Future[Seq[Future[Boolean]]] = initializedContainers.map(_.map(state => state.isReady()))
53+
val readyInits: Future[Seq[Future[Boolean]]] =
54+
initializedContainers.map(_.map(state => state.isReady()))
5455
val simplifiedReadyInits: Future[Seq[Boolean]] = readyInits.flatMap(Future.sequence(_))
5556
Await.result(simplifiedReadyInits, containerStartTimeout)
5657
initGraph(dependants, initializedContainers)

impl/docker-java/src/main/scala/com/whisk/docker/impl/dockerjava/DockerJavaExecutor.scala

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,28 @@ class DockerJavaExecutor(override val host: String, client: DockerClient)
2424
}
2525

2626
val baseCmd = {
27+
val hostConfig = new com.github.dockerjava.api.model.HostConfig()
28+
hostConfig
29+
.withOption(spec.networkMode)({ case (config, value) => config.withNetworkMode(value) })
30+
.withPortBindings(spec.bindPorts.foldLeft(new Ports()) {
31+
case (ps, (guestPort, DockerPortMapping(Some(hostPort), address))) =>
32+
ps.bind(ExposedPort.tcp(guestPort), Ports.Binding.bindPort(hostPort))
33+
ps
34+
case (ps, (guestPort, DockerPortMapping(None, address))) =>
35+
ps.bind(ExposedPort.tcp(guestPort), Ports.Binding.empty())
36+
ps
37+
})
38+
.withLinks(
39+
new Links(spec.links.map {
40+
case ContainerLink(container, alias) =>
41+
new Link(container.name.get, alias)
42+
}: _*)
43+
)
44+
.withBinds(new Binds(volumeToBind.map(_._2): _*))
45+
2746
val tmpCmd = client
2847
.createContainerCmd(spec.image)
48+
.withHostConfig(hostConfig)
2949
.withPortSpecs(spec.bindPorts
3050
.map({
3151
case (guestPort, DockerPortMapping(Some(hostPort), address)) =>
@@ -37,27 +57,7 @@ class DockerJavaExecutor(override val host: String, client: DockerClient)
3757
.withTty(spec.tty)
3858
.withStdinOpen(spec.stdinOpen)
3959
.withEnv(spec.env: _*)
40-
.withOption(spec.networkMode) {
41-
case (config, networkMode) => config.withNetworkMode(networkMode)
42-
}
43-
.withPortBindings(
44-
spec.bindPorts.foldLeft(new Ports()) {
45-
case (ps, (guestPort, DockerPortMapping(Some(hostPort), address))) =>
46-
ps.bind(ExposedPort.tcp(guestPort), Ports.Binding.bindPort(hostPort))
47-
ps
48-
case (ps, (guestPort, DockerPortMapping(None, address))) =>
49-
ps.bind(ExposedPort.tcp(guestPort), Ports.Binding.empty())
50-
ps
51-
}
52-
)
53-
.withLinks(
54-
spec.links.map {
55-
case ContainerLink(container, alias) =>
56-
new Link(container.name.get, alias)
57-
}.asJava
58-
)
5960
.withVolumes(volumeToBind.map(_._1): _*)
60-
.withBinds(volumeToBind.map(_._2): _*)
6161
.withOption(spec.user) { case (config, user) => config.withUser(user) }
6262
.withOption(spec.hostname) { case (config, hostName) => config.withHostName(hostName) }
6363

impl/spotify/src/main/scala/com/whisk/docker/impl/spotify/SpotifyDockerCommandExecutor.scala

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,14 @@ class SpotifyDockerCommandExecutor(override val host: String, client: DockerClie
2828
case (guestPort, DockerPortMapping(None, address)) =>
2929
guestPort.toString -> Collections.singletonList(PortBinding.randomPort(address))
3030
}
31-
val binds: Seq[String] = spec.volumeMappings.map{
32-
volumeMapping =>
33-
val rw = if(volumeMapping.rw) ":rw" else ""
34-
volumeMapping.host + ":" + volumeMapping.container + rw
31+
val binds: Seq[String] = spec.volumeMappings.map { volumeMapping =>
32+
val rw = if (volumeMapping.rw) ":rw" else ""
33+
volumeMapping.host + ":" + volumeMapping.container + rw
3534
}
3635

3736
val hostConfig = {
38-
val hostConfigBase = HostConfig.builder().portBindings(portBindings.asJava).binds(binds.asJava)
37+
val hostConfigBase =
38+
HostConfig.builder().portBindings(portBindings.asJava).binds(binds.asJava)
3939

4040
val links = spec.links.map {
4141
case ContainerLink(container, alias) => s"${container.name.get}:$alias"
@@ -47,6 +47,9 @@ class SpotifyDockerCommandExecutor(override val host: String, client: DockerClie
4747
.withOption(spec.networkMode) {
4848
case (config, networkMode) => config.networkMode(networkMode)
4949
}
50+
.withOption(spec.hostConfig.flatMap(_.tmpfs)) {
51+
case (config, value) => config.tmpfs(value.asJava)
52+
}
5053
.build()
5154
}
5255

samples/src/main/scala/com/whisk/docker/DockerElasticsearchService.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ trait DockerElasticsearchService extends DockerKit {
1010
val elasticsearchContainer = DockerContainer("elasticsearch:1.7.1")
1111
.withPorts(DefaultElasticsearchHttpPort -> None, DefaultElasticsearchClientPort -> None)
1212
.withReadyChecker(
13-
DockerReadyChecker
14-
.HttpResponseCode(DefaultElasticsearchHttpPort, "/")
15-
.within(100.millis)
16-
.looped(20, 1250.millis)
13+
DockerReadyChecker
14+
.HttpResponseCode(DefaultElasticsearchHttpPort, "/")
15+
.within(100.millis)
16+
.looped(20, 1250.millis)
1717
)
1818

1919
abstract override def dockerContainers: List[DockerContainer] =

samples/src/main/scala/com/whisk/docker/DockerNeo4jService.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ trait DockerNeo4jService extends DockerKit {
1010
.withPorts(DefaultNeo4jHttpPort -> None)
1111
.withEnv("NEO4J_AUTH=none")
1212
.withReadyChecker(
13-
DockerReadyChecker
14-
.HttpResponseCode(DefaultNeo4jHttpPort, "/db/data/")
15-
.within(100.millis)
16-
.looped(20, 1250.millis)
13+
DockerReadyChecker
14+
.HttpResponseCode(DefaultNeo4jHttpPort, "/db/data/")
15+
.within(100.millis)
16+
.looped(20, 1250.millis)
1717
)
1818

1919
abstract override def dockerContainers: List[DockerContainer] =

samples/src/main/scala/com/whisk/docker/DockerPostgresService.scala

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,25 @@ trait DockerPostgresService extends DockerKit {
1616
.withPorts((PostgresAdvertisedPort, Some(PostgresExposedPort)))
1717
.withEnv(s"POSTGRES_USER=$PostgresUser", s"POSTGRES_PASSWORD=$PostgresPassword")
1818
.withReadyChecker(
19-
new PostgresReadyChecker(PostgresUser, PostgresPassword, Some(PostgresExposedPort)).looped(15, 1.second)
19+
new PostgresReadyChecker(PostgresUser, PostgresPassword, Some(PostgresExposedPort))
20+
.looped(15, 1.second)
2021
)
2122

2223
abstract override def dockerContainers: List[DockerContainer] =
2324
postgresContainer :: super.dockerContainers
2425
}
2526

26-
class PostgresReadyChecker(user: String, password: String, port: Option[Int] = None) extends DockerReadyChecker {
27+
class PostgresReadyChecker(user: String, password: String, port: Option[Int] = None)
28+
extends DockerReadyChecker {
2729

28-
override def apply(container: DockerContainerState)(implicit docker: DockerCommandExecutor, ec: ExecutionContext) =
29-
container.getPorts().map(ports =>
30-
Try {
31-
Class.forName("org.postgresql.Driver")
32-
val url = s"jdbc:postgresql://${docker.host}:${port.getOrElse(ports.values.head)}/"
33-
Option(DriverManager.getConnection(url, user, password))
34-
.map(_.close)
35-
.isDefined
36-
}.getOrElse(false)
37-
)
38-
}
30+
override def apply(container: DockerContainerState)(implicit docker: DockerCommandExecutor,
31+
ec: ExecutionContext) =
32+
container
33+
.getPorts()
34+
.map(ports =>
35+
Try {
36+
Class.forName("org.postgresql.Driver")
37+
val url = s"jdbc:postgresql://${docker.host}:${port.getOrElse(ports.values.head)}/"
38+
Option(DriverManager.getConnection(url, user, password)).map(_.close).isDefined
39+
}.getOrElse(false))
40+
}

0 commit comments

Comments
 (0)