在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
但我不知道它会工作的想法。
- 更改容器分区的磁盘空间
- Docker容器中的用户和文件权限configuration(docker-compose版本3)
- 在EC2实例上使用IAMangular色的“没有基本身份validation凭据”
- 用etcdconfigurationHipache
- 在pipe理员subprocess中运行docker run中传递的环境variables
- 监视Docker卷中的文件更改
- 允许在docker-machineconfiguration的主机中存在不安全的registry
- nvidia-docker无法对话:http:// localhost:3476 / docker / cli / json
- ADD之后图像层的不合理增加。 句子