使用带有 dropwizard 的 env 变量覆盖服务器连接器配置

2022-09-02 05:20:14

我已经在dw邮件列表上发布了这个问题,但没有得到答案。

我可以假设下面的YML格式不再适用于DW 0.7.0吗?(使用 @ char 插入 env var)

server:
  applicationConnectors:
    - type: http
      bindHost: @OPENSHIFT_DIY_IP@
      port: @OPENSHIFT_DIY_PORT@

错误:

格式错误的 YAML 在第 28 行,列:17;在扫描下一个令牌时;找到无法启动任何令牌的字符 @ '@'。(不要使用 @ 进行缩进);在“读者”中,第 28 行,第 17 列:bindHost:@OPENSHIFT_DIY_IP@

所以我决定使用这种格式:

server:
  type: simple
  applicationContextPath: /
  adminContextPath: /admin
  connector:
      type: http
      bindHost: localhost
      port: 8080

并尝试通过jvm选项覆盖它:

java -Ddw.server.connector.bindHost=$OPENSHIFT_DIY_IP -Ddw.server.connector.port=$OPENSHIFT_DIY_PORT -jar target/myapp.jar server myapp.yml

我的本地环境变量:

OPENSHIFT_DIY_IP=localhost
OPENSHIFT_DIY_PORT=8080

我从此设置中获得的错误:

线程“main” java.lang.RuntimeException中的异常:java.net.SocketException:Org.eclipse.jetty.setuid.SetUIDListener.lifeCycleStarting(SetUIDListener.java:213)...原因: java.net.SocketException: 未解析的地址 at sun.nio.ch.Net.translateToSocketException(Net.java:157) ...WARN [2014-05-03 20:11:19,412] org.eclipse.jetty.util.component.AbstractLifeCycle: FAILED org.eclipse.jetty.server.Server@91b85: java.lang.RuntimeException: java.net.SocketException: Unresold address

我做错了什么?


答案 1

从 Dropwizard 版本 0.8.0 开始,您可以从配置 yml 文件中访问环境变量。它还支持在环境变量不可用的情况下设置默认值。请参阅此处的文档。

// put environment variable inside ${}
// use :- operator to provide default value

dbHost: ${DB_HOST}
dbPort: ${DB_PORT:-1234}
// dbPort = 1234, if DB_PORT environment variable has no value

重要说明:要使此功能正常工作,您需要设置一个 .SubstitutingSourceProviderEnvironmentVariableSubstitutor

// Enable variable substitution with environment variables
bootstrap.setConfigurationSourceProvider(
    new SubstitutingSourceProvider(
        bootstrap.getConfigurationSourceProvider(),
        new EnvironmentVariableSubstitutor())
);

更新: 15 /Nov/2017 正如@EFreak在评论部分提到的,如果未定义环境变量,将抛出,除非您使用 https://github.com/dropwizard/dropwizard/blob/master/dropwizard-configuration/src/main/java/io/dropwizard/configuration/EnvironmentVariableSubstitutor.javanew EnvironmentVariableSubstitutor()UndefinedEnvironmentVariableExceptionstrictfalsenew EnvironmentVariableSubstitutor(false)


答案 2

有人为DW创建了一个捆绑包,以便能够嵌入env vars


推荐