我们正在开发几个基于Lagom的Scala微服务。它们是使用application.conf中的变量替换来配置的,例如。
mysql = {
url = "jdbc:mysql://"${?ENV_MYSQL_DATABASE_URL}在开发过程中,我们通过一个调用System.setProperty("ENV_MYSQL_DATABASE_URL", url)的env.sbt文件将这些变量设置为Java System Properties。这工作得很好。
现在,我想将其部署到本地Docker安装的容器中。我们使用SbtReactiveAppPlugin从build.sbt构建Docker镜像,然后简单地运行sbt Docker/publishLocal。这就像预期的一样,创建了一个Docker镜像,我可以启动它了。
但是,使用标准docker或docker-compose机制传入环境变量似乎不起作用。虽然我可以看到Docker容器中的环境变量设置正确(在bash上使用env验证,也可以在服务中执行log.debug("ENV_MYSQL_DATABASE_URL via env: " + sys.env("ENV_MYSQL_DATABASE_URL"))验证),但它们不被application.conf使用,并且在配置系统中不可用。值为空/未设置(通过configuration.getString("ENV_MYSQL_DATABASE_URL").toString()和mysql系统等系统抛出的异常进行校验)。
我让它工作的唯一方法是通过JAVA_OPTS=-D ENV_MYSQL_DATABASE_URL=....将它伪造到JAVA_OPTS中。然而,这看起来像是一个hack,并且似乎不能很好地扩展到几十个环境参数。
我是否遗漏了什么,有没有一种方法可以方便地在Lagom应用程序和application.conf中使用环境变量?
谢谢!
发布于 2020-01-23 22:20:01
多年来,我一直使用Lightbend配置通过docker容器中的环境变量来配置Lagom服务,所以我知道这是可以做到的,并且在我的经验中非常简单。
考虑到这一点,当你说application.conf没有使用它们时,你的意思是它们是未设置的吗?请注意,除非将非常特定的选项作为Java属性传递,否则configuration.getString("ENV_MYSQL_DATABASE_URL")不会从环境变量中读取数据,因此检查这一点不会告诉您mysql.url是否受环境变量的影响。configuration.getString("mysql.url")将让您更好地了解正在发生的事情。
我怀疑实际上您的Docker映像是用硬编码的dev-mode属性构建的,而且由于Java系统属性优先于其他所有属性,所以它们隐藏了环境变量。
您可能会发现,按照以下方式构建application.conf非常有用:
mysql_database_url = "..." # Some reasonable default default for dev-mode
mysql_database_url = ${?ENV_MYSQL_DATABASE_URL}
mysql {
url = "jdbc://"${mysql_database_url}
}在这种情况下,您为开发人员提供了一个合理的默认值(可能在文档中包含了一些以与该配置兼容的方式运行MySQL的说明)。然后,可以通过设置Java属性(例如JAVA_OPTS=-Dmysql_database_url)或通过设置ENV_MYSQL_DATABASE_URL环境变量来覆盖默认值。
发布于 2020-01-24 01:20:45
虽然我同意Levi Ramsey提供的答案,但我建议您使用typesafe's config加载您的配置
https://stackoverflow.com/questions/59877729
复制相似问题