使用环境变量配置Lagom Scala应用程序的Docker部署

使用环境变量配置Lagom Scala应用程序的Docker部署,scala,docker,lagom,Scala,Docker,Lagom,我们正在开发几个基于Lagom的Scala微服务。它们使用application.conf中的变量替换进行配置,例如 mysql = { url = "jdbc:mysql://"${?ENV_MYSQL_DATABASE_URL} 在开发过程中,我们通过调用System.setProperty(“env\u MYSQL\u DATABASE\u URL”,URL)的env.sbt文件将这些变量设置为Java系统属性。这很好用 现在,我想将其部署到本地Docker安装的容器中。我们正在使用

我们正在开发几个基于Lagom的Scala微服务。它们使用application.conf中的变量替换进行配置,例如

mysql = {
  url = "jdbc:mysql://"${?ENV_MYSQL_DATABASE_URL}
在开发过程中,我们通过调用
System.setProperty(“env\u MYSQL\u DATABASE\u URL”,URL)
env.sbt
文件将这些变量设置为Java系统属性。这很好用

现在,我想将其部署到本地Docker安装的容器中。我们正在使用
sbtreactiveApplugin
build.sbt
构建Docker映像,只需运行
sbt Docker/publishLocal
。这就像预期的一样,一个Docker图像被创建,我可以启动它

但是,使用标准docker或docker compose机制传入环境变量似乎不起作用。虽然我可以看到在Docker容器中正确设置了环境变量(在bash上使用
env
并通过在服务中执行
log.debug(“env\u MYSQL\u DATABASE\u URL via env:+sys.env(“env\u MYSQL\u DATABASE\u URL”)
进行验证),
application.conf
不使用它们,在配置系统中也不可用。这些值为空/未设置(通过
configuration.getString(“ENV\u MYSQL\u DATABASE\u URL”).toString()以及MYSQL系统和其他系统引发的异常进行验证)

我让它工作的唯一方法是通过
JAVA\u OPTS=-D ENV\u MYSQL\u DATABASE\u URL=..
将其编入
JAVA\u OPTS
。然而,这看起来像是一种黑客行为,而且似乎不能很好地与数十个环境参数进行扩展

我是否遗漏了一些东西,有没有一种方法可以轻松地使用Lagom应用程序和application.conf中的环境变量


谢谢

多年来,我一直使用Lightbend config通过docker容器中的环境变量来配置Lagom服务,因此我知道这是可以做到的,并且在我的经验中非常简单

记住这一点,当你说它们没有被
application.conf
使用时,你的意思是它们没有被设置吗?请注意,除非您将非常特定的选项作为Java属性传递,
configuration.getString(“ENV\u MYSQL\u DATABASE\u URL”)
将不会从环境变量中读取,因此检查该选项不会告诉您
MYSQL.URL
是否受环境变量的影响
configuration.getString(“mysql.url”)
将让您更好地了解正在发生的事情

我怀疑实际上您的Docker映像是使用硬编码的dev模式属性构建的,并且由于Java系统属性优先于其他所有属性,因此它们隐藏了环境变量

您可能会发现按照以下思路构造
应用程序.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\u OPTS=-Dmysql\u database\u url
)或通过设置
ENV\u MYSQL\u database\u url
环境变量来覆盖默认值。

虽然我同意Levi Ramsey提供的答案,但我建议您使用加载您的配置

他正在使用Lightbend/Typesafe配置,包含在Lagom中。谢谢你的回答!这确实帮了我不少忙。关于
configuration.getString
不返回env变量的观点是正确的,这就是误导我的地方。此外,事实证明,配置似乎在很大程度上起了作用,但还有一些其他因素使情况变得更糟。一个是运行
sbt runAll
实际上并没有验证JWT令牌,而在Docker中运行,因此它看起来像是在runAll中工作,而实际上它甚至没有尝试。