产品采用Docker部署,为了减少镜像的体积某个版本升级后改用Alpine Linux作为基础镜像,升级完后发现Mongodb连接出错,异常如图:
显然是机器名解析不了,但应用的配置文件里明明是大写的,查了下Mongo的代码,发现Mongo驱动会把大写转小写:,查看下驱动提交记录https://github.com/mongodb/mongo-java-driver/commit/03a6fbea6ec0608adf854116f2cb2c616664ee9e,给出的理由是DNS不区分大小写,查了下/etc/hosts配置文件,发现文件里配置的是大写的,在windows和linux宿主机上测试了下,确实不区分,在容器里ping以下,提示地址不正确,那问题应该出在Alpine Linux里了,Google了一会没发现相关的资料,只能查看代码了,把Alpine Linux依赖的musl libc源码下载下来,查下getaddrinfo函数的实现,
比较的时候没有忽略大小写,再查下glibc的实现:
忽略了大小写,由此得知该问题是由于musl libc没有按照DNS的规范实现该函数