gpt4 book ai didi

SBT:如何 Dockerize 一个 fat jar 子?

转载 作者:行者123 更新时间:2023-12-01 12:22:45 26 4
gpt4 key购买 nike

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

  • 我想声明对 assembly 的依赖来自 docker:publish 的任务任务,以便在将 fat jar 添加到图像之前创建它。我按照 doc 中的说明做了,但它不起作用。 assembly在我调用它之前不会运行。publish := (publish dependsOn assembly).value
  • 构建镜像的步骤之一是复制 fat jar 。由于程序集插件在 target/scala_whatever/projectname-assembly-X.X.X.jar 中创建了 jar ,我需要知道确切的scala_whatever和 jar 名称。大会似乎有 key 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这不是我想放脂肪 jar 的地方。
    请注意,默认命令显示为 show dockerCommands在 sbt 控制台中。

    关于SBT:如何 Dockerize 一个 fat jar 子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42605598/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com