diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2019-05-20 07:17:49 +0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2019-05-20 07:17:49 +0800 |
commit | d12a0d762193d83f83c837eb4affad389744a6cd (patch) | |
tree | 3c26c7dfff35b27b843cdc6175fe05c53f930b76 /contrib/docker/src/DockerModule.scala | |
parent | 827c72af63fdfd3ee6e4ed0e18a3e5a42e2c0c1c (diff) | |
parent | 1cb439fce4af7a61166f13a3c5045fa7c73b25de (diff) | |
download | mill-d12a0d762193d83f83c837eb4affad389744a6cd.tar.gz mill-d12a0d762193d83f83c837eb4affad389744a6cd.tar.bz2 mill-d12a0d762193d83f83c837eb4affad389744a6cd.zip |
Merge branch '599'
Diffstat (limited to 'contrib/docker/src/DockerModule.scala')
-rw-r--r-- | contrib/docker/src/DockerModule.scala | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/contrib/docker/src/DockerModule.scala b/contrib/docker/src/DockerModule.scala new file mode 100644 index 00000000..bbf4d926 --- /dev/null +++ b/contrib/docker/src/DockerModule.scala @@ -0,0 +1,73 @@ +import mill.T +import mill.scalalib.JavaModule +import os.Shellable.IterableShellable + +import scala.collection.immutable._ + +trait DockerModule { outer: JavaModule => + + trait DockerConfig extends mill.Module { + /** + * Tags that should be applied to the built image + * In the standard registry/repository:tag format + */ + def tags: T[Seq[String]] = T(List(outer.artifactName())) + def labels: T[Map[String, String]] = Map.empty[String, String] + def baseImage: T[String] = "gcr.io/distroless/java:latest" + def pullBaseImage: T[Boolean] = T(baseImage().endsWith(":latest")) + private def baseImageCacheBuster: T[(Boolean, Double)] = T.input { + val pull = pullBaseImage() + if(pull) (pull, Math.random()) else (pull, 0d) + } + + def dockerfile: T[String] = T { + val jarName = assembly().path.last + val labelRhs = labels() + .map { case (k, v) => + val lineBrokenValue = v + .replace("\r\n", "\\\r\n") + .replace("\n", "\\\n") + .replace("\r", "\\\r") + s""""$k"="$lineBrokenValue"""" + } + .mkString(" ") + + val labelLine = if(labels().isEmpty) "" else s"LABEL $labelRhs" + + s""" + |FROM ${baseImage()} + |$labelLine + |COPY $jarName /$jarName + |ENTRYPOINT ["java", "-jar", "/$jarName"] + """.stripMargin + } + + final def build = T { + val dest = T.ctx().dest + + val asmPath = outer.assembly().path + os.copy(asmPath, dest / asmPath.last) + + os.write(dest / "Dockerfile", dockerfile()) + + val log = T.ctx().log + + val tagArgs = tags().flatMap(t => List("-t", t)) + + val (pull, _) = baseImageCacheBuster() + val pullLatestBase = IterableShellable(if(pull) Some("--pull") else None) + + val result = os + .proc("docker", "build", tagArgs, pullLatestBase, dest) + .call(stdout = os.Inherit, stderr = os.Inherit) + + log.info(s"Docker build completed ${if(result.exitCode == 0) "successfully" else "unsuccessfully"} with ${result.exitCode}") + tags() + } + + final def push() = T.command { + val tags = build() + tags.foreach(t => os.proc("docker", "push", t).call(stdout = os.Inherit, stderr = os.Inherit)) + } + } +}
\ No newline at end of file |