我正在使用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选项?
答案 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