SBT:如何将一个胖罐子归档?

SBT:如何将一个胖罐子归档?,sbt,sbt-assembly,sbt-native-packager,Sbt,Sbt Assembly,Sbt Native Packager,我正在用一个胖罐子塑造一个码头工人的形象。我使用sbt-assembly插件构建jar,使用sbt-native-packager构建Docker映像。我对SBT不是很熟悉,我遇到了以下问题 我想从docker:publish任务中声明对assembly任务的依赖关系,以便在将胖jar添加到图像之前创建胖jar。我按照指示做了,但不起作用程序集在我调用它之前不会运行 publish:=(发布依赖于程序集)。值 构建映像的步骤之一是复制胖罐子。由于assembly插件在target/scala\

我正在用一个胖罐子塑造一个码头工人的形象。我使用
sbt-assembly
插件构建jar,使用
sbt-native-packager
构建Docker映像。我对SBT不是很熟悉,我遇到了以下问题

  • 我想从
    docker:publish
    任务中声明对
    assembly
    任务的依赖关系,以便在将胖jar添加到图像之前创建胖jar。我按照指示做了,但不起作用<代码>程序集在我调用它之前不会运行

    publish:=(发布依赖于程序集)。值

  • 构建映像的步骤之一是复制胖罐子。由于assembly插件在
    target/scala\u whatever/projectname-assembly-X.X.jar
    中创建jar,因此我需要知道确切的
    scala\u whatever
    和jar名称。程序集似乎有一个键
    assemblyJarName
    ,但我不确定如何访问它。我尝试了以下失败的方法

    Cmd(“复制”、“目标/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命令,因为默认值添加了两个我不需要的脚本,因为我也覆盖了入口点。另外,默认的workdir是
    /opt/docker
    ,这不是我想要放胖罐子的地方。
    请注意,默认命令由sbt控制台中的
    show dockerCommands
    显示。

    Yep。这是文档中的示例。一个小提示:您可以删除
    enablePlugins(…)
    中的
    DockerPlugin
    。默认情况下,
    JavaAppPackaging
    会启用它。@Muki不完全是从文档中获取的。该文档使用了弃用的
    jarName
    ,并且没有将fat jar作为Docker容器的示例,而只是单个片段。但是是的,我是从医生那里得到这个主意的。你能说有没有办法停止生成作为默认入口点的脚本?我不包括它们,但它们仍然是在本地生成的
    opt/docker/bin