Skip to content

Commit 1f019e7

Browse files
author
Chris Birchall
committed
Support for specifying a custom entrypoint
1 parent ed8bddd commit 1f019e7

File tree

6 files changed

+48
-43
lines changed

6 files changed

+48
-43
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ object DockerTypesafeConfig extends DockerKitDockerJava {
4646
case class DockerConfig(`image-name`: String,
4747
`container-name`: Option[String],
4848
command: Option[Seq[String]],
49+
entrypoint: Option[Seq[String]],
4950
`environmental-variables`: Seq[String] = Seq.empty,
5051
`port-maps`: Option[Map[String, DockerConfigPortMap]],
5152
`ready-checker`: Option[DockerConfigReadyChecker],
@@ -63,6 +64,7 @@ object DockerTypesafeConfig extends DockerKitDockerJava {
6364
image = `image-name`,
6465
name = `container-name`,
6566
command = command,
67+
entrypoint = entrypoint,
6668
bindPorts = bindPorts,
6769
env = `environmental-variables`,
6870
readyChecker = readyChecker,

config/src/test/resources/application.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ docker {
8383

8484
elasticsearch {
8585
image-name = "elasticsearch:1.7.1"
86+
entrypoint = [ "my", "custom", "entrypoint" ]
8687
ready-checker {
8788
http-response-code {
8889
port = 9200

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class DockerConfigSpec extends FlatSpec with Matchers with DockerKitConfig {
3838
configureDockerContainer("docker.mongodb") shouldBe mongodbExpected
3939

4040
val elasticExpected = DockerContainer("elasticsearch:1.7.1")
41+
.withEntrypoint("my", "custom", "entrypoint")
4142
.withPorts(9200 -> None, 9300 -> None)
4243
.withReadyChecker(
4344
DockerReadyChecker

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ case class HostConfig(
1717
case class DockerContainer(image: String,
1818
name: Option[String] = None,
1919
command: Option[Seq[String]] = None,
20+
entrypoint: Option[Seq[String]] = None,
2021
bindPorts: Map[Int, DockerPortMapping] = Map.empty,
2122
tty: Boolean = false,
2223
stdinOpen: Boolean = false,
@@ -33,6 +34,8 @@ case class DockerContainer(image: String,
3334

3435
def withCommand(cmd: String*) = copy(command = Some(cmd))
3536

37+
def withEntrypoint(entrypoint: String*) = copy(entrypoint = Some(entrypoint))
38+
3639
def withPorts(ps: (Int, Option[Int])*) =
3740
copy(bindPorts = ps.toMap.mapValues(hostPort => DockerPortMapping(hostPort)))
3841

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

Lines changed: 37 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -23,48 +23,45 @@ class DockerJavaExecutor(override val host: String, client: DockerClient)
2323
(volume, new Bind(mapping.host, volume, AccessMode.fromBoolean(mapping.rw)))
2424
}
2525

26-
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
26+
val hostConfig = new com.github.dockerjava.api.model.HostConfig()
27+
.withOption(spec.networkMode)({ case (config, value) => config.withNetworkMode(value) })
28+
.withPortBindings(spec.bindPorts.foldLeft(new Ports()) {
29+
case (ps, (guestPort, DockerPortMapping(Some(hostPort), address))) =>
30+
ps.bind(ExposedPort.tcp(guestPort), Ports.Binding.bindPort(hostPort))
31+
ps
32+
case (ps, (guestPort, DockerPortMapping(None, address))) =>
33+
ps.bind(ExposedPort.tcp(guestPort), Ports.Binding.empty())
34+
ps
35+
})
36+
.withLinks(
37+
new Links(spec.links.map {
38+
case ContainerLink(container, alias) =>
39+
new Link(container.name.get, alias)
40+
}: _*)
41+
)
42+
.withBinds(new Binds(volumeToBind.map(_._2): _*))
43+
44+
val cmd = client
45+
.createContainerCmd(spec.image)
46+
.withHostConfig(hostConfig)
47+
.withPortSpecs(spec.bindPorts
48+
.map({
49+
case (guestPort, DockerPortMapping(Some(hostPort), address)) =>
50+
s"$address:$hostPort:$guestPort"
51+
case (guestPort, DockerPortMapping(None, address)) => s"$address::$guestPort"
3752
})
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-
46-
val tmpCmd = client
47-
.createContainerCmd(spec.image)
48-
.withHostConfig(hostConfig)
49-
.withPortSpecs(spec.bindPorts
50-
.map({
51-
case (guestPort, DockerPortMapping(Some(hostPort), address)) =>
52-
s"$address:$hostPort:$guestPort"
53-
case (guestPort, DockerPortMapping(None, address)) => s"$address::$guestPort"
54-
})
55-
.toSeq: _*)
56-
.withExposedPorts(spec.bindPorts.keys.map(ExposedPort.tcp).toSeq: _*)
57-
.withTty(spec.tty)
58-
.withStdinOpen(spec.stdinOpen)
59-
.withEnv(spec.env: _*)
60-
.withVolumes(volumeToBind.map(_._1): _*)
61-
.withOption(spec.user) { case (config, user) => config.withUser(user) }
62-
.withOption(spec.hostname) { case (config, hostName) => config.withHostName(hostName) }
63-
64-
spec.name.map(tmpCmd.withName).getOrElse(tmpCmd)
65-
}
53+
.toSeq: _*)
54+
.withExposedPorts(spec.bindPorts.keys.map(ExposedPort.tcp).toSeq: _*)
55+
.withTty(spec.tty)
56+
.withStdinOpen(spec.stdinOpen)
57+
.withEnv(spec.env: _*)
58+
.withVolumes(volumeToBind.map(_._1): _*)
59+
.withOption(spec.user) { case (config, user) => config.withUser(user) }
60+
.withOption(spec.hostname) { case (config, hostName) => config.withHostName(hostName) }
61+
.withOption(spec.name) { case (config, name) => config.withName(name) }
62+
.withOption(spec.command) { case (config, c) => config.withCmd(c: _*) }
63+
.withOption(spec.entrypoint) { case (config, entrypoint) => config.withEntrypoint(entrypoint: _*) }
6664

67-
val cmd = spec.command.fold(baseCmd)(c => baseCmd.withCmd(c: _*))
6865
Future(cmd.exec()).map { resp =>
6966
if (resp.getId != null && resp.getId != "") {
7067
resp.getId

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class SpotifyDockerCommandExecutor(override val host: String, client: DockerClie
5858
.build()
5959
}
6060

61-
val builder = ContainerConfig
61+
val containerConfig = ContainerConfig
6262
.builder()
6363
.image(spec.image)
6464
.hostConfig(hostConfig)
@@ -68,8 +68,9 @@ class SpotifyDockerCommandExecutor(override val host: String, client: DockerClie
6868
.env(spec.env: _*)
6969
.withOption(spec.user) { case (config, user) => config.user(user) }
7070
.withOption(spec.hostname) { case (config, hostname) => config.hostname(hostname) }
71-
72-
val containerConfig = spec.command.fold(builder)(c => builder.cmd(c: _*)).build()
71+
.withOption(spec.command) { case (config, command) => config.cmd(command: _*) }
72+
.withOption(spec.entrypoint) { case (config, entrypoint) => config.entrypoint(entrypoint: _*) }
73+
.build()
7374

7475
val creation = Future(
7576
spec.name.fold(client.createContainer(containerConfig))(

0 commit comments

Comments
 (0)