build.sbt和application.conf没有读取.env设置的环境变量



我正在着手构建一个Play Framework应用程序的容器。为此,我使用sbt本机打包程序插件,并使用命令"sbt-clean-docker:publishLocal"。为了简化未来的管道和开发环境,我启用了sbt-dotenv插件,以便使用.env文件来定义变量。这些变量正在build.sbt和application.conf 中使用

build.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").....

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

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

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

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

最新更新