springboot redis的配置 被环境变量覆盖

2019-07-19  本文已影响0人  NazgulSun

问题描述

我们在docker 容器里有两个 应用。

redis:
host: redis
password:
port: 6379
database: 0
timeout: 1000
pool:
max-active: 50
max-wait: 3000
max-idle: 8
maxTotal: 1024
maxWaitMillis: 1000

我们使用 @Value{redis.port} 去拿数据。
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private int com.inkdrop.config.cache.CacheConfiguration.redisPort; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert value of type [java.lang.String] to required type [int]; nested exception is java.lang.NumberFormatException: For input string: "tcp://172.17.0.3:6379"

非常奇怪的是发现了 redis.port 被 替换成了"tcp://172.17.0.3:6379"。

原因分析

springboot 中的redis.port 变量被优先级高的变量覆盖。

参考
https://github.com/docker-library/redis/issues/53
https://docs.docker.com/network/links/
这两篇文章, docker 在配置 内部子 容器连接的时候,会生存一些列的 环境变量。
{alias_port} 就是其中一个, 在我们的case 里面就是 redis_port
而这个环境变量 和我们的 redis.port 刚好重合。

springboot 启动时候,环境变量的优先级大于 profile 配置文件的优先级。
并且环境变量的 A_B 会转成 A.B

解决方案, 不使用docker的links feature,因为是legacy的了。
或者是 在环境变量命名的时候,不要重复。

第一种是正确的方法,因为第二种的话, 使用的人并不知道我要避免和环境变量不要冲突。

上一篇下一篇

猜你喜欢

热点阅读