【问题标题】:Typesafe config HOCON - guidance for environment variable replacement of lists?Typesafe config HOCON - 环境变量替换列表的指南?
【发布时间】:2017-04-15 16:29:38
【问题描述】:

这是我最终使用的,因为我似乎无法以良好的顺序进行变量替换。鉴于 CORS Allowed Origins 的 Play Framework HOCON 部分,它允许本地、开发、阶段和生产部署,并且不符合 12 因素:

play {
  # https://www.playframework.com/documentation/2.5.x/resources/confs/filters-helpers/reference.conf
  filters {
    # use default values for gzip, csrf & security headers
    # setup cors
    cors {
      # whitelist all paths
      pathPrefixes = ["/"]
      allowedOrigins = [
        "http://localhost:8080"
        "http://app.127.0.0.1.nip.io:8080"
        "http://app.192.168.64.2.nip.io"
        "http://app.192.168.42.173.nip.io"
        "http://app.terradatum.local"
        "http://app.dev.terradatum.com"
        "https://app.dev.terradatum.com"
        "http://app.stage.terradatum.com"
        "https://app.stage.terradatum.com"
        "http://app.terradatum.com"
        "https://app.terradatum.com"
      ]
    }
  }
}

以下两种HOCON我都试过了,环境设置也如图:

# HOCON
allowedOrigins = ${?APP_ALLOWED_ORIGINS}
# ENV
export APP_ALLOWED_ORIGINS='"http://app.127.0.0.1.nip.io:8080","http://app.192.168.64.2.nip.io","http://app.192.168.42.173.nip.io","http://app.terradatum.local","http://app.dev.terradatum.com","https://app.dev.terradatum.com","http://app.stage.terradatum.com","https://app.stage.terradatum.com","http://app.terradatum.com","https://app.terradatum.com"'

还有……

# HOCON
allowedOrigins = [
  ${?APP_ALLOWED_ORIGINS}
  "http://app.127.0.0.1.nip.io:8080"
  "http://app.192.168.64.2.nip.io"
  "http://app.192.168.42.173.nip.io"
  "http://app.terradatum.local"
  "http://app.dev.terradatum.com"
  "https://app.dev.terradatum.com"
  "http://app.stage.terradatum.com"
  "https://app.stage.terradatum.com"
  "http://app.terradatum.com"
  "https://app.terradatum.com"
]
# ENV
export APP_ALLOWED_ORIGINS="http://some-new-cors.terradatum.com\nhttps://some-new-cors.terradatum.com\n"

许多其他的 CORS 实现都允许使用正则表达式,而 WTH 不能播放?

除此之外,列表的 HOCON 处理对我来说非常成问题......上面的第一个实现工作,但是任何迭代我在 application.conf 中有一个现有的默认列表失败......

通过环境变量替换向 HOCON 添加列表或列表项的推荐方法是什么?

【问题讨论】:

    标签: playframework typesafe-config hocon


    【解决方案1】:

    如果我正确阅读了您的帖子(我没有在其中看到真正的“问题”),那么您正在尝试找到一种方法来将不同的值添加到您的 CORS 列表中,具体取决于您的应用运行的环境。

    我建议从另一个角度解决这个问题: 创建不同的配置文件,其中包含您要自定义的值并包含通用 application.conf 文件。在您的部署配置中,让 play 加载您的暂存配置而不是 application.conf。

    例如如果您创建了您的开发阶段,请将其添加到您的部署配置中(假设您将 sbt-native-packager 与 docker 一起使用)

    javaOptions in Universal ++= Seq(
      "-Dconfig.resource=application.dev.conf"
    )
    

    您的 application.dev.conf 文件如下所示:

    include "application.conf"
    play.filters.cors {
          # whitelist all paths
          pathPrefixes = ["/"]
          allowedOrigins = [
            "http://localhost:8080"
            "http://app.127.0.0.1.nip.io:8080"
            "http://app.192.168.64.2.nip.io"
            "http://app.192.168.42.173.nip.io"
            "http://app.terradatum.local"
            "http://app.dev.terradatum.com"
            "https://app.dev.terradatum.com"
    
          ]
        }
    

    问题是,您的环境变量不是一个列表,而是一个字符串。HOCON 中没有可以将您的字符串拆分为列表的转换方法。

    要遵循 12 因素方法,您可以尝试将列表(的变化部分)拆分为类似

    ORIGIN_1=http://localhost:8080
    ORIGIN_2=http://app.127.0.0.1.nip.io:8080
    

    然后将它们包含在您的配置中,例如

    play.filters.cors.allowedOrigins = [${?ORIGIN_1}] ${play.filters.cors.allowedOrigins}
    play.filters.cors.allowedOrigins = [${?ORIGIN_2}] ${play.filters.cors.allowedOrigins}
    

    【讨论】:

    • 这是 an 答案,但不是我真正想要的......虽然你提出了一个很好的观点,我已经更新了我的问题以实际包含一个问题.如果您阅读了 12 要素应用程序的指南,您会发现应用程序的配置可通过环境进行修改是一项基本要求。当然这不可能 100% 的时间(嵌入的 reference.conf 文件不遵循 env-replacement 方案),也许 CORS 允许的起源不是最好的例子,但它仍然是我需要解决的问题。
    • 是的,你回答了我问题的第二部分 - “添加列表项”到 HOCON 列表
    猜你喜欢
    • 1970-01-01
    • 2016-05-26
    • 2019-04-02
    • 1970-01-01
    • 2015-02-26
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    相关资源
    最近更新 更多