使用环境变量配置Lagom Scala应用程序的Docker部署
我们正在开发几个基于Lagom的Scala微服务。它们使用application.conf中的变量替换进行配置,例如使用环境变量配置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安装的容器中。我们正在使用
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中工作,而实际上它甚至没有尝试。