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:=(发布依赖于程序集)。值
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
。