Skip to content

Commit 0af1b28

Browse files
committed
Merge pull request #317 from rfranco/feature/docker-latest
flag to update latest tag
2 parents 9ebb44b + 54a1d94 commit 0af1b28

File tree

7 files changed

+42
-6
lines changed

7 files changed

+42
-6
lines changed

src/main/scala/com/typesafe/sbt/packager/docker/DockerPlugin.scala

+20-6
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ trait DockerPlugin extends Plugin with UniversalPlugin {
9292
}
9393
}
9494

95-
def publishLocalDocker(context: File, tag: String, log: Logger): Unit = {
95+
def publishLocalDocker(context: File, tag: String, latest: Boolean, log: Logger): Unit = {
9696
val cmd = Seq("docker", "build", "--force-rm", "-t", tag, ".")
9797
val cwd = context.getParentFile
9898

@@ -105,6 +105,15 @@ trait DockerPlugin extends Plugin with UniversalPlugin {
105105
throw new RuntimeException("Nonzero exit value: " + ret)
106106
else
107107
log.info("Built image " + tag)
108+
109+
if (latest) {
110+
val name = tag.substring(0, tag.lastIndexOf(":")) + ":latest"
111+
val latestCmd = Seq("docker", "tag", tag, name)
112+
Process(latestCmd).! match {
113+
case 0 => log.info("Update Latest from image" + tag)
114+
case n => sys.error("Failed to run docker tag")
115+
}
116+
}
108117
}
109118

110119
def publishDocker(tag: String, log: Logger): Unit = {
@@ -152,6 +161,7 @@ trait DockerPlugin extends Plugin with UniversalPlugin {
152161
packageName in Docker <<= packageName,
153162
executableScriptName in Docker <<= executableScriptName,
154163
dockerRepository := None,
164+
dockerUpdateLatest := false,
155165
sourceDirectory in Docker <<= sourceDirectory apply (_ / "docker"),
156166
target in Docker <<= target apply (_ / "docker"),
157167

@@ -180,13 +190,17 @@ trait DockerPlugin extends Plugin with UniversalPlugin {
180190
(repo, name, version) =>
181191
repo.map(_ + "/").getOrElse("") + name + ":" + version
182192
},
183-
publishLocal <<= (dockerGenerateConfig, dockerGenerateContext, dockerTarget, streams) map {
184-
(config, _, target, s) =>
185-
publishLocalDocker(config, target, s.log)
193+
publishLocal <<= (dockerGenerateConfig, dockerGenerateContext, dockerTarget, dockerUpdateLatest, streams) map {
194+
(config, _, target, updateLatest, s) =>
195+
publishLocalDocker(config, target, updateLatest, s.log)
186196
},
187-
publish <<= (publishLocal, dockerTarget, streams) map {
188-
(_, target, s) =>
197+
publish <<= (publishLocal, dockerTarget, dockerUpdateLatest, streams) map {
198+
(_, target, updateLatest, s) =>
189199
publishDocker(target, s.log)
200+
if (updateLatest) {
201+
val name = target.substring(0, target.lastIndexOf(":")) + ":latest"
202+
publishDocker(name, s.log)
203+
}
190204
}
191205
))
192206
}

src/main/scala/com/typesafe/sbt/packager/docker/Keys.scala

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ trait DockerKeys {
1414
val dockerExposedPorts = SettingKey[Seq[Int]]("dockerExposedPorts", "Ports exposed by Docker image")
1515
val dockerExposedVolumes = SettingKey[Seq[String]]("dockerExposedVolumes", "Volumes exposed by Docker image")
1616
val dockerRepository = SettingKey[Option[String]]("dockerRepository", "Repository for published Docker image")
17+
val dockerUpdateLatest = SettingKey[Boolean]("dockerUpdateLatest", "Set to update latest tag")
1718
}
1819

1920
object Keys extends DockerKeys {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import com.typesafe.sbt.SbtNativePackager._
2+
import NativePackagerKeys._
3+
4+
packageArchetype.java_application
5+
6+
name := "docker-test"
7+
8+
version := "0.1.0"
9+
10+
maintainer := "Gary Coady <[email protected]>"
11+
12+
dockerUpdateLatest := true
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % sys.props("project.version"))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
object Main extends App {
2+
println("Hello world")
3+
}
+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Generate the Docker image locally
2+
> docker:publishLocal
3+
$ exec bash -c 'docker run docker-test:latest | grep -q "Hello world"'

src/sphinx/DetailedTopics/docker.rst

+2
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ Publishing Settings
6262
``dockerRepository``
6363
The repository to which the image is pushed when the ``docker:publish`` task is run. This should be of the form ``[username]`` (assumes use of the ``index.docker.io`` repository) or ``[repository.host]/[username]``.
6464

65+
``dockerUpdateLatest``
66+
The flag to automatic update the latest tag when the ``docker:publish`` task is run. Default value is ``FALSE``.
6567

6668
Tasks
6769
-----

0 commit comments

Comments
 (0)