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健康检查

无法连接到 Scala 测试中的 Cassandra docker 容器

Bitbucket 管道因内存不足而失败,同时在 docker (Scala) 中使用 cassandra 进行测试