Scala,docker - 如何使用 sbt-native-packager 在多模块应用程序中设置 mainClass?
Scala, docker - how to set mainClass in multimodule application using sbt-native-packager?
我在 Scala 中创建了一个多模块 sbt
项目。现在是:
主项目 (main-service
) 和 build.sbt
文件
http 模块与 Main
class
在我的 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
我在 Scala 中创建了一个多模块 sbt
项目。现在是:
主项目 (
main-service
) 和build.sbt
文件http 模块与
Main
class
在我的 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