Skip to content

Commit

Permalink
Merge pull request #280 from garycoady/wip/docker-volume
Browse files Browse the repository at this point in the history
Support Docker volumes.
  • Loading branch information
muuki88 committed Jun 23, 2014
2 parents 99d272c + 12bfaba commit 1527da9
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 7 deletions.
30 changes: 23 additions & 7 deletions src/main/scala/com/typesafe/sbt/packager/docker/DockerPlugin.scala
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import sbt._
trait DockerPlugin extends Plugin with UniversalPlugin {
val Docker = config("docker") extend Universal

private[this] final def makeDockerContent(dockerBaseImage: String, dockerBaseDirectory: String, maintainer: String, daemonUser: String, name: String, exposedPorts: Seq[Int]) = {
private[this] final def makeDockerContent(dockerBaseImage: String, dockerBaseDirectory: String, maintainer: String, daemonUser: String, name: String, exposedPorts: Seq[Int], exposedVolumes: Seq[String]) = {
val dockerCommands = Seq(
Cmd("FROM", dockerBaseImage),
Cmd("MAINTAINER", maintainer),
Expand All @@ -27,12 +27,27 @@ trait DockerPlugin extends Plugin with UniversalPlugin {
Some(Cmd("EXPOSE", exposedPorts.mkString(" ")))
}

Dockerfile(dockerCommands ++ exposeCommand: _*).makeContent
// If the exposed volume does not exist, the volume is made available
// with root ownership. This may be too strict for some directories,
// and we lose the feature that all directories below the install path
// can be written to by the binary. Therefore the directories are
// created before the ownership is changed.
val volumeCommands: Seq[CmdLike] = {
if (exposedVolumes.isEmpty)
Seq()
else
Seq(
ExecCmd("RUN", Seq("mkdir", "-p") ++ exposedVolumes: _*),
ExecCmd("VOLUME", exposedVolumes: _*)
)
}

Dockerfile(volumeCommands ++ exposeCommand ++ dockerCommands: _*).makeContent
}

private[this] final def generateDockerConfig(
dockerBaseImage: String, dockerBaseDirectory: String, maintainer: String, daemonUser: String, normalizedName: String, exposedPorts: Seq[Int], target: File) = {
val dockerContent = makeDockerContent(dockerBaseImage, dockerBaseDirectory, maintainer, daemonUser, normalizedName, exposedPorts)
dockerBaseImage: String, dockerBaseDirectory: String, maintainer: String, daemonUser: String, normalizedName: String, exposedPorts: Seq[Int], exposedVolumes: Seq[String], target: File) = {
val dockerContent = makeDockerContent(dockerBaseImage, dockerBaseDirectory, maintainer, daemonUser, normalizedName, exposedPorts, exposedVolumes)

val f = target / "Dockerfile"
IO.write(f, dockerContent)
Expand Down Expand Up @@ -64,6 +79,7 @@ trait DockerPlugin extends Plugin with UniversalPlugin {
publishArtifact := false,
defaultLinuxInstallLocation := "/opt/docker",
dockerExposedPorts := Seq(),
dockerExposedVolumes := Seq(),
dockerPackageMappings <<= (sourceDirectory) map { dir =>
MappingsHelper contentOf dir
},
Expand All @@ -77,9 +93,9 @@ trait DockerPlugin extends Plugin with UniversalPlugin {
contextDir
},
dockerGenerateConfig <<=
(dockerBaseImage, defaultLinuxInstallLocation, maintainer, daemonUser, normalizedName, dockerExposedPorts, target) map {
case (dockerBaseImage, baseDirectory, maintainer, daemonUser, normalizedName, exposedPorts, target) =>
generateDockerConfig(dockerBaseImage, baseDirectory, maintainer, daemonUser, normalizedName, exposedPorts, target)
(dockerBaseImage, defaultLinuxInstallLocation, maintainer, daemonUser, normalizedName, dockerExposedPorts, dockerExposedVolumes, target) map {
case (dockerBaseImage, baseDirectory, maintainer, daemonUser, normalizedName, exposedPorts, exposedVolumes, target) =>
generateDockerConfig(dockerBaseImage, baseDirectory, maintainer, daemonUser, normalizedName, exposedPorts, exposedVolumes, target)
}
))
}
1 change: 1 addition & 0 deletions src/main/scala/com/typesafe/sbt/packager/docker/Keys.scala
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ trait DockerKeys {

val dockerBaseImage = SettingKey[String]("dockerBaseImage", "Base image for Dockerfile.")
val dockerExposedPorts = SettingKey[Seq[Int]]("dockerExposedPorts", "Ports exposed by Docker image")
val dockerExposedVolumes = SettingKey[Seq[String]]("dockerExposedVolumes", "Volumes exposed by Docker image")
}

object Keys extends DockerKeys {
Expand Down
9 changes: 9 additions & 0 deletions src/sbt-test/docker/volumes/build.sbt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import NativePackagerKeys._

packagerSettings

name := "simple-test"

version := "0.1.0"

dockerExposedVolumes in Docker := Seq("/opt/docker/logs", "/opt/docker/config")
1 change: 1 addition & 0 deletions src/sbt-test/docker/volumes/project/plugins.sbt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % sys.props("project.version"))
4 changes: 4 additions & 0 deletions src/sbt-test/docker/volumes/test
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Stage the distribution and ensure files show up.
> docker:stage
$ exec grep -q -F 'VOLUME ["/opt/docker/logs", "/opt/docker/config"]' target/docker/Dockerfile
$ exec grep -q -F 'RUN ["mkdir", "-p", "/opt/docker/logs", "/opt/docker/config"]' target/docker/Dockerfile

0 comments on commit 1527da9

Please sign in to comment.