我正在用胖罐建立一个Docker镜像。我使用sbt-assembly
插件来构建jar,使用sbt-native-packager
来构建Docker镜像。我对SBT不是很熟悉,并且遇到了以下问题。
我想从assembly
任务声明对docker:publish
任务的依赖关系,以便在将fat jar添加到图像之前创建它。我按照doc的指示做了,但是没有用。 assembly
在我调用它之前不会运行。
publish := (publish dependsOn assembly).value
构建图像的一个步骤是复制胖罐。由于程序集插件在target/scala_whatever/projectname-assembly-X.X.X.jar
中创建了jar,我需要知道确切的scala_whatever
和jar名称。程序集似乎有一个键assemblyJarName
,但我不知道如何访问它。我尝试了下面的失败。
Cmd("COPY", "target/scala*/*.jar /app.jar")
帮助!
答案 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
显示。