Scala,docker - 如何使用 sbt-native-packager 在多模块应用程序中设置 mainClass?

Scala, docker - how to set mainClass in multimodule application using sbt-native-packager?

我在 Scala 中创建了一个多模块 sbt 项目。现在是:

在我的 sbt 文件中我有:

lazy val root = (project in file("."))
  .aggregate(http)
  .settings(
    dockerBaseImage := "openjdk:jre-alpine",
    name := "main-service",
    libraryDependencies ++= Seq(

    )
  )
  .enablePlugins(JavaAppPackaging)
  .enablePlugins(DockerPlugin)
  .enablePlugins(AshScriptPlugin)

lazy val http = (project in file("http"))
  .settings(
    mainClass in Compile := Some("Main"),
    name := "main-http",
    libraryDependencies ++= Seq(    
    ))

如您所见,我想 运行 它与 docker。这个项目的图像创建的很好,但是当我制作 docker run 然后我得到一个错误:

docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"/opt/docker/bin/main-service\": stat /opt/docker/bin/main-service: no such file or directory": unknown.

我认为问题可能出在 mainClass 行。我的 Main class 在 main-http/src/main/scala 目录中,但看起来 docker 没有看到它。

我应该如何移动此 Main class 或更改路径并 运行 正确?

如果你想在 http 子项目中保留主 class,你需要将插件也移动到这个项目中,如下所示。

lazy val root = (project in file("."))
  .aggregate(http)
  .settings(name := "main-service")

lazy val http = (project in file("http"))
  .settings(
    mainClass in Compile := Some("Main"),
    dockerBaseImage := "openjdk:jre-alpine",
    name := "main-http",
    libraryDependencies ++= Seq()
  )
  .enablePlugins(JavaAppPackaging)
  .enablePlugins(DockerPlugin)
  .enablePlugins(AshScriptPlugin)

必须在 Main class 所在的项目中启用插件。

要构建 docker 图像,请执行

sbt http/docker:publishLocal