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

时间:2014-05-05 03:46:05

标签: java dropwizard

我已经在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:未解析的地址       at 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:未解决的地址

我做错了什么?

2 个答案:

答案 0 :(得分:38)

从Dropwizard版本 0.8.0 开始,您可以从配置yml文件访问环境变量。它还支持在环境变量不可用时设置默认值。 See the docs here.

示例

// 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

重要提示:为此,您需要设置SubstitutingSourceProvider EnvironmentVariableSubstitutor

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

更新:2017年11月15日 正如@EFreak在评论部分中所提到的,如果未定义环境变量,new EnvironmentVariableSubstitutor()将抛出UndefinedEnvironmentVariableException,除非您使用{{1将strict模式设置为false }} https://github.com/dropwizard/dropwizard/blob/master/dropwizard-configuration/src/main/java/io/dropwizard/configuration/EnvironmentVariableSubstitutor.java

答案 1 :(得分:5)

有人为DW创建了bundle以便能够嵌入env vars