Skip to content

Commit 3b67038

Browse files
author
Chris Birchall
committed
Support for specifying hard and soft memory limits
1 parent 1f019e7 commit 3b67038

File tree

6 files changed

+31
-7
lines changed

6 files changed

+31
-7
lines changed

config/src/main/scala/com/whisk/docker/config/DockerTypesafeConfig.scala

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@ object DockerTypesafeConfig extends DockerKitDockerJava {
5050
`environmental-variables`: Seq[String] = Seq.empty,
5151
`port-maps`: Option[Map[String, DockerConfigPortMap]],
5252
`ready-checker`: Option[DockerConfigReadyChecker],
53-
`volume-maps`: Seq[VolumeMapping] = Seq.empty) {
53+
`volume-maps`: Seq[VolumeMapping] = Seq.empty,
54+
memory: Option[Long],
55+
`memory-reservation`: Option[Long]) {
5456

5557
def toDockerContainer(): DockerContainer = {
5658
val bindPorts = `port-maps`.fold(EmptyPortBindings) { _.values.map(_.asTuple).toMap } mapValues {
@@ -68,7 +70,9 @@ object DockerTypesafeConfig extends DockerKitDockerJava {
6870
bindPorts = bindPorts,
6971
env = `environmental-variables`,
7072
readyChecker = readyChecker,
71-
volumeMappings = `volume-maps`
73+
volumeMappings = `volume-maps`,
74+
memory = memory,
75+
memoryReservation = `memory-reservation`
7276
)
7377
}
7478
}

config/src/test/resources/application.conf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ docker {
8484
elasticsearch {
8585
image-name = "elasticsearch:1.7.1"
8686
entrypoint = [ "my", "custom", "entrypoint" ]
87+
memory = 536870912 # 512MB
88+
memory-reservation = 268435456 # 256MB
8789
ready-checker {
8890
http-response-code {
8991
port = 9200

config/src/test/scala/com/whisk/docker/config/test/DockerConfigSpec.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ class DockerConfigSpec extends FlatSpec with Matchers with DockerKitConfig {
4040
val elasticExpected = DockerContainer("elasticsearch:1.7.1")
4141
.withEntrypoint("my", "custom", "entrypoint")
4242
.withPorts(9200 -> None, 9300 -> None)
43+
.withMemory(536870912)
44+
.withMemoryReservation(268435456)
4345
.withReadyChecker(
4446
DockerReadyChecker
4547
.HttpResponseCode(9200, "/")

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ case class DockerContainer(image: String,
3030
logLineReceiver: Option[LogLineReceiver] = None,
3131
user: Option[String] = None,
3232
hostname: Option[String] = None,
33+
memory: Option[Long] = None,
34+
memoryReservation: Option[Long] = None,
3335
hostConfig: Option[HostConfig] = None) {
3436

3537
def withCommand(cmd: String*) = copy(command = Some(cmd))
@@ -63,5 +65,16 @@ case class DockerContainer(image: String,
6365

6466
def withHostname(hostname: String) = copy(hostname = Some(hostname))
6567

68+
/**
69+
* Set the hard limit on memory usage (in bytes)
70+
*/
71+
def withMemory(memory: Long) = copy(memory = Some(memory))
72+
73+
/**
74+
* Set the soft limit on memory usage (in bytes)
75+
*/
76+
def withMemoryReservation(memoryReservation: Long) = copy(memoryReservation = Some(memoryReservation))
77+
6678
def withHostConfig(hostConfig: HostConfig) = copy(hostConfig = Some(hostConfig))
79+
6780
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ class DockerJavaExecutor(override val host: String, client: DockerClient)
6161
.withOption(spec.name) { case (config, name) => config.withName(name) }
6262
.withOption(spec.command) { case (config, c) => config.withCmd(c: _*) }
6363
.withOption(spec.entrypoint) { case (config, entrypoint) => config.withEntrypoint(entrypoint: _*) }
64+
.withOption(spec.memory) { case (config, memory) => config.withMemory(memory) }
65+
.withOption(spec.memoryReservation) { case (config, memoryReservation) =>
66+
config.withHostConfig(config.getHostConfig.withMemoryReservation(memoryReservation))
67+
}
6468

6569
Future(cmd.exec()).map { resp =>
6670
if (resp.getId != null && resp.getId != "") {

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ import com.spotify.docker.client.exceptions.ContainerNotFoundException
1212
import com.spotify.docker.client.messages.{
1313
ContainerConfig,
1414
HostConfig,
15-
PortBinding,
16-
AttachedNetwork
15+
PortBinding
1716
}
1817
import com.spotify.docker.client.{DockerClient, LogMessage}
1918
import com.whisk.docker._
@@ -49,12 +48,12 @@ class SpotifyDockerCommandExecutor(override val host: String, client: DockerClie
4948
val hostConfigBuilder =
5049
if (links.isEmpty) hostConfigBase else hostConfigBase.links(links.asJava)
5150
hostConfigBuilder
52-
.withOption(spec.networkMode) {
53-
case (config, networkMode) => config.networkMode(networkMode)
54-
}
5551
.withOption(spec.hostConfig.flatMap(_.tmpfs)) {
5652
case (config, value) => config.tmpfs(value.asJava)
5753
}
54+
.withOption(spec.networkMode) { case (config, networkMode) => config.networkMode(networkMode) }
55+
.withOption(spec.memory) { case (config, memory) => config.memory(memory) }
56+
.withOption(spec.memoryReservation) { case (config, reservation) => config.memoryReservation(reservation) }
5857
.build()
5958
}
6059

0 commit comments

Comments
 (0)