SBT:如何停靠一个胖罐



我正在用胖罐子构建一个码头图像。我使用sbt-assembly插件来构建JAR,然后使用sbt-native-packager来构建Docker映像。我对SBT并不熟悉,并且正在遇到以下问题。

  1. 我想从docker:publish任务中声明对assembly任务的依赖性,以便在将其添加到图像之前创建胖罐。我按照文档的指示做过,但它行不通。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")

帮助!

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

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命令,因为默认值添加了几个我不需要的脚本,因为我也覆盖了入口点。另外,默认的工作迪尔是/opt/docker,这不是我要放胖罐子的地方。请注意,默认命令由show dockerCommands在SBT控制台中显示。

最新更新