首页 > 解决方案 > build.sbt 和 application.conf 没有读取 .env 设置的环境变量

问题描述

我正在尝试构建 Play Framework 应用程序的容器。为此,我使用 sbt-native-packager 插件并使用命令“sbt clean docker:publishLocal”。为了简化未来的管道和开发环境,我启用 sbt-dotenv 插件以使用 .env 文件,我可以在其中定义我的变量。这些变量在 build.sbt 和 application.conf 中使用

构建.sbt

name := sys.env.get("APP_NAME")
organization := sys.props.get("CLIENT_NAME")
version := sys.props.get("APP_VSN")

application.conf 按如下方式使用它们,以允许使用默认值

default.username = username
default.username = ${?DB_USERNAME}
default.password = password
default.password = ${?DB_PASSWD}

运行 sbt clean docker:publishLocal 时,我可以看到插件加载了变量,但配置文件永远找不到它们,并且总是回退到默认值。由于我对 Docker 的了解有点有限,我想也许我需要将 envVars 传递给 Docker,如下所示:

dockerEnvVars := Map("APP_NAME" -> sys.env.get("APP_NAME").....

但这也不起作用,它们存在于最终容器中,但我在构建过程中需要它们,以便配置文件可以使用它们构建可分发文件。我真的不知道还能尝试什么。我尝试了不同的方法来获取环境变量,尝试了不同的版本,更新了我的插件,但似乎在互联网上找不到类似的东西。

标签: scaladockerplayframeworksbt

解决方案


sbt-dotenv 在构建时设置环境变量,而 Lightbend 配置库在运行时解析它们。如果您希望在编译时替换 application.conf 中的变量,您可以:

  • 编写一个将加载application.conf、解析变量并创建一个包含实际值的新配置文件的 sbt 任务
  • 自定义mappings任务,使原始application.conf图像不包含在最终图像中,而是使用新生成的配置文件

但坦率地说,这整件事听起来像是个坏主意。为什么不直接使用--env标志docker run并在那里设置环境变量呢?


推荐阅读