sbt / sbt-native-packager

sbt Native Packager
https://sbt-native-packager.readthedocs.io/en/stable/
BSD 2-Clause "Simplified" License
1.59k stars 437 forks source link

How to get dynamic jar files into docker #1538

Closed andrewhibbert closed 1 year ago

andrewhibbert commented 1 year ago

Expected behaviour

Able to get jar files into docker

Actual behaviour

Cannot get jar files into docker.

I have tried, using universal mapping:

    mappings in Universal ++= {
        val dir = target.value / "scala-2.13"
        (dir ** AllPassFilter --- dir) pair relativeTo(dir)
    }

I have tried docker mapping, problem I cannot find a way of doing this after the build of the jar:

  .settings( Docker / dockerPackageMappings := {
    Seq(
      file((assembly / assemblyOutputPath).value) -> s"${name.value}-assembly-${version.value}.jar"
    )

Errors:

If using file, as of ordering

[error] java.lang.RuntimeException: 1 error(s) found
[error]     at scala.sys.package$.error(package.scala:30)
[error]     at com.typesafe.sbt.packager.validation.Validation$.runAndThrow(Validation.scala:65)
[error]     at com.typesafe.sbt.packager.docker.DockerPlugin$.$anonfun$projectSettings$71(DockerPlugin.scala:341)
[error]     at com.typesafe.sbt.packager.docker.DockerPlugin$.$anonfun$projectSettings$71$adapted(DockerPlugin.scala:340)
[error]     at scala.Function1.$anonfun$compose$1(Function1.scala:49)
[error]     at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:62)
[error]     at sbt.std.Transform$$anon$4.work(Transform.scala:68)
[error]     at sbt.Execute.$anonfun$submit$2(Execute.scala:282)
[error]     at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:23)
[error]     at sbt.Execute.work(Execute.scala:291)
[error]     at sbt.Execute.$anonfun$submit$1(Execute.scala:282)
[error]     at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:265)
[error]     at sbt.CompletionService$$anon$2.call(CompletionService.scala:64)
[error]     at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
[error]     at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
[error]     at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
[error]     at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
[error]     at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
[error]     at java.base/java.lang.Thread.run(Thread.java:833)
[error] (Docker / validatePackage) 1 error(s) found
[error] Total time: 82 s (01:22), completed 1 Mar 2023, 20:01:35

Information

andrewhibbert commented 1 year ago

Somewhat hacky but I was able to do this with the following:

assembly / assemblyOutputPath := file(s"target/docker/stage/${(assembly/assemblyJarName).value}")

I then have dockerCommands separately

  .settings( dockerCommands := {
    val fatJar = (assembly/assemblyJarName).value
    val fatJarTargetPath = s"/app/${name.value}-assembly.jar"
    Seq(
      Cmd("FROM", "adoptopenjdk/openjdk11:jdk-11.28"),
      Cmd("ADD", s"${fatJar}", s"${fatJarTargetPath}"),
    )
  })

Then to sort out dependency:

  .settings(
    dockerCommands := dockerCommands.dependsOn(assembly).value
  )