基于环境变量的运行时配置与sbt native packager

nov*_*von 5 scala sbt-native-packager amazon-elastic-beanstalk

我正在使用sbt native packager插件创建我的应用程序的zip文件,以便部署到弹性beanstalk.我想在我的beanstalk环境中设置环境变量,并将它们用于在运行时配置我的应用程序.我试图在我的Procfile中引用env变量,如下所示:

web: ./bin/bridgeservice -Dhttp.port=$PORT
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为$PORT没有由打包程序生成的启动脚本进行插值.

我也尝试在build.sbt中定义变量,如下所示:

import scala.util.Properties

javaOptions in Universal ++= Seq(
  "-Dhttp.port=" + Properties.envOrElse("PORT", "9004"),
)
Run Code Online (Sandbox Code Playgroud)

这也不起作用,因为打包程序PORT在构建可分发zip时需要env变量,并且在application.ini文件中硬编码默认值9004.

是否可以在应用程序启动时根据环境变量动态传递java选项?

小智 1

不确定这是否有帮助,但我在构建多模块项目的 docker 映像时遇到了类似的问题。

我以此结束:

def sysPropOrDefault(propName: String, default: String): String = Option(System.getProperty(propName)).getOrElse(default)
val somePort = sysPropOrDefault("port", "9004")
Run Code Online (Sandbox Code Playgroud)

并在项目定义中:

lazy val someProject = project("some-project")
  .enablePlugins(JavaServerAppPackaging)
  .settings(
    javaOptions in Universal ++= Seq(
      s"-Dhttp.port=$somePort"
    )
  )
Run Code Online (Sandbox Code Playgroud)

在我的例子中,将 javaOptions 添加到项目设置级别至关重要。选项前面的 s 不是拼写错误。

从终端运行命令时,我调用了:

sbt clean update -Dport=9005 docker:publishLocal
Run Code Online (Sandbox Code Playgroud)