在Docker容器中运行时,从属性文件实例化Spring Configuration类时出错

当我在Tomcat 8 Docker容器中运行我的webapp时,发生NumberFormatException。 当Spring试图实例化MongoConfig类时,会发生错误,该类注入从类path属性文件中获取的@Values。 属性文件中的属性如下所示:

mongodb.host=mongodb mongodb.database=mydatabase mongodb.port=27017 mongodb.username=myusername mongodb.password=mypassword 

在MongoConfig文件中,当它到达这个地方时,它会被NumberFormatException抛弃:

 @Value("${mongodb.port}") private int port; 

根据错误,尽pipe事实上属性文件清楚地给出了没有任何其他东西(如IP地址)的端口,但它正在拾取“tcp://172.17.0.2:27017”作为它尝试将端口拉入的input。 它被选中的IP地址是它分配给mongodb容器(一个单独的Docker容器,没有装饰,只是mongodb:最新的–name mongodb,然后在Tomcat容器的运行中链接为mongodb:mongodb命令)。 如果你在运行的Tomcat容器中进行shell操作并查看/ etc / hosts,你会看到mongodb的条目,并且它在Tomcat容器中可以看到。

为什么Spring在获取包含IP和端口的整个tcp地址时,在属性文件中给它自己的端口? 我该如何处理?

更新 – 错误是:“错误创build名为com.mydomain.myproject.config.MongoConfig的bean:通过字段”端口“表示的不满意的依赖项:无法将types[java.lang.String]的值转换为所需的types[int ];嵌套exception是java.lang.NumberFormatException:对于inputstring:“tcp://172.17.0.2:27017”;嵌套exception是org.springframework.beans.TypeMismatchException:无法转换types为[java.lang.String ]为必需的types[int];嵌套的exception是java.lang.NumberFormatException:对于inputstring:“tcp://172.17.0.2:27017”“

看来mongodb.port正在容器内被覆盖。 将端口号改为99999什么都不做。 更改属性名称为“mylovely.port”然后给了我们一个错误,抱怨该端口超出范围,并显示它是99999.修改它回到27017然后给了我一个正在运行的Web应用程序,没有崩溃。 剩下的问题是,什么压倒这个值,为什么一个名为端口的属性有一个完整的地址? 是不是 – 链接选项不仅在tomcat容器的/ etc / hosts中设置了一个条目,而且还创build了一种名为mongodb的全局variables或属性,不pipe它在什么时候总是返回完整的地址?

Docker设置一个优先于configuration文件的环境variables MONGODB_PORT 。 您可以通过检查( docker inspect )一个容器来certificate它,或者通过在容器中使用docker exec并执行env命令来certificate它。

更新:如何解决它? 首先, 阅读关于PropertySource抽象 。 接下来,你会发现环境variables值可以被系统属性覆盖( -Dmongodb.port=27017 )。 另外我会尝试使用PropertyOverrideConfigurer但我不知道它会工作的想法。