SBT:如何对一个胖罐进行Docker化?

时间:2017-03-05 07:14:17

标签: sbt sbt-assembly sbt-native-packager

我正在用胖罐建立一个Docker镜像。我使用sbt-assembly插件来构建jar,使用sbt-native-packager来构建Docker镜像。我对SBT不是很熟悉,并且遇到了以下问题。

  1. 我想从assembly任务声明对docker:publish任务的依赖关系,以便在将fat jar添加到图像之前创建它。我按照doc的指示做了,但是没有用。 assembly在我调用它之前不会运行。

    publish := (publish dependsOn assembly).value

  2. 构建图像的一个步骤是复制胖罐。由于程序集插件在target/scala_whatever/projectname-assembly-X.X.X.jar中创建了jar,我需要知道确切的scala_whatever和jar名称。程序集似乎有一个键assemblyJarName,但我不知道如何访问它。我尝试了下面的失败。

    Cmd("COPY", "target/scala*/*.jar /app.jar")

  3. 帮助!

1 个答案:

答案 0 :(得分:3)

回答我自己的问题,以下工作:

enablePlugins(JavaAppPackaging, DockerPlugin)

assemblyMergeStrategy in assembly := {
  case x => {
    val oldStrategy = (assemblyMergeStrategy in assembly).value
    val strategy = oldStrategy(x)
    if (strategy == MergeStrategy.deduplicate)
      MergeStrategy.first
    else strategy
  }
}

// Remove all jar mappings in universal and append the fat jar
mappings in Universal := {
  val universalMappings = (mappings in Universal).value
  val fatJar = (assembly in Compile).value
  val filtered = universalMappings.filter {
    case (file, name) => !name.endsWith(".jar")
  }
  filtered :+ (fatJar -> ("lib/" + fatJar.getName))
}

dockerRepository := Some("username")

import com.typesafe.sbt.packager.docker.{Cmd, ExecCmd}
dockerCommands := Seq(
  Cmd("FROM", "username/spark:2.1.0"),
  Cmd("WORKDIR", "/"),
  Cmd("COPY", "opt/docker/lib/*.jar", "/app.jar"),
  ExecCmd("ENTRYPOINT", "/opt/spark/bin/spark-submit", "/app.jar")
)

我完全覆盖了docker命令,因为默认添加了一些我不需要的脚本,因为我也覆盖了入口点。此外,默认的workdir是/opt/docker,这不是我想要放入胖罐的地方。 请注意,默认命令由sbt控制台中的show dockerCommands显示。