Scala,docker - 如何使用 sbt-native-packager 在多模块应用程序中设置 mainClass?
Posted
技术标签:
【中文标题】Scala,docker - 如何使用 sbt-native-packager 在多模块应用程序中设置 mainClass?【英文标题】:Scala, docker - how to set mainClass in multimodule application using sbt-native-packager? 【发布时间】:2020-03-19 01:22:22 【问题描述】:我在 Scala 中创建了一个多模块 sbt
项目。现在是:
主项目 (main-service
) 和 build.sbt
文件
带有Main
类的http模块
在我的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-http/src/main/scala
目录中有我的Main
类,但看起来docker 没有看到它。
我应该如何移动这个Main
类或更改它的路径并正确运行它?
【问题讨论】:
【参考方案1】:如果您想将主类保留在http
子项目中,您也需要将插件移动到该项目中,如下所示。
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 类所在的项目中启用。
要构建 docker 映像,请执行
sbt http/docker:publishLocal
【讨论】:
是的!这正是我所需要的。谢谢。以上是关于Scala,docker - 如何使用 sbt-native-packager 在多模块应用程序中设置 mainClass?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 jre-alpine 基础镜像创建 Scala Play 应用程序的 Docker 镜像
如何运行自定义 docker 镜像 testContainer
使用 sbt native 插件创建了 scala docker 镜像。我必须添加 LDAP CA 证书。如何在图像中添加它
通过SBT进行Dockerized Scala应用程序的Marathon健康检查