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

时间:2017-01-09 01:56:14

标签: scala elastic-beanstalk sbt-native-packager

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

web: ./bin/bridgeservice -Dhttp.port=$PORT

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

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

import scala.util.Properties

javaOptions in Universal ++= Seq(
  "-Dhttp.port=" + Properties.envOrElse("PORT", "9004"),
)

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

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

2 个答案:

答案 0 :(得分:1)

javaOptions in Universal中的设置被编译到conf / application.ini文件中,但相应于sbt-native-packager docs application.ini目前不支持变量替换:

  

该文件将安装到$ {app_home} /conf/application.ini和   从那里读取启动脚本。您可以使用#作为评论和新评论   你喜欢的线条。该文件目前没有任何变量   代换。如果您需要,我们建议您使用build.sbt   来自您构建的信息。

因此,基于env var的运行时设置可以通过多种方式实现:

解决方案#1。为生成的启动脚本添加额外的定义

在build.sbt:

bashScriptExtraDefines += """addJava "-Dhttp.port=${PORT:-9004}""""

查看Application and runtime configuration文档了解详情。

解决方案#2:在目标服务器中设置JAVA_OPTS env var

只需在目标服务器上设置JAVA_OPTS环境变量,并使其可用于启动脚本。对于像AWS ElasticBeanstalk这样的环境,这可以是最简单的解决方案,其中可以在应用程序的环境配置页面上设置env vars。

答案 1 :(得分:0)

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

我结束了这个:

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

并在项目定义中:

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

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

从终端I运行命令时调用:

sbt clean update -Dport=9005 docker:publishLocal