scala - 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").....
但这也不起作用,它们存在于最终容器中,但我在构建过程中需要它们,以便配置文件可以使用它们构建可分发文件。我真的不知道还能尝试什么。我尝试了不同的方法来获取环境变量,尝试了不同的版本,更新了我的插件,但似乎在互联网上找不到类似的东西。
解决方案
sbt-dotenv 在构建时设置环境变量,而 Lightbend 配置库在运行时解析它们。如果您希望在编译时替换 application.conf 中的变量,您可以:
- 编写一个将加载
application.conf
、解析变量并创建一个包含实际值的新配置文件的 sbt 任务 - 自定义
mappings
任务,使原始application.conf
图像不包含在最终图像中,而是使用新生成的配置文件
但坦率地说,这整件事听起来像是个坏主意。为什么不直接使用--env
标志docker run
并在那里设置环境变量呢?
推荐阅读
- amazon-dynamodb - 在 dynamo putItem 中有条件地指定属性
- stata - Stata:tsline 图表值不在正确的日期
- react-native - 如何将 react 原生组件集成到原生应用中?
- powershell - yq 抓取所有不包含单词 powershell 的元素
- asp.net-mvc - 在 Azure AD 身份验证 ASP.Net Core 之后操作会话数据
- python - Python 没有意识到安装了 sqlalchemy 扩展?
- python - 如何转换 torchscript 模型以在 OpenCV 中使用它?
- tk - 我收到 HTTP 错误 404 使此代码下载 YouTube 知道为什么我很确定链接尝试加载没有任何问题
- javascript - Safari 错误。当尝试使用模糊过滤器为 svg 转换设置动画时,safari 非常滞后
- r - 使用 rbind 函数 rbind 三个数据库