Docker上的java.net.UnknownHostException

前端之家收集整理的这篇文章主要介绍了Docker上的java.net.UnknownHostException前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在尝试为ZooKeeper创建docker容器并在集群模式下配置它们(完整代码herehere).

容器基于Alpine Linux(高山:Docker Hub上的3.2),但我要描述的问题也发生在官方Java容器(java:7)上.

我使用以下命令启动集群:

docker run -d -h zk1 --name zk1 dockmob/zookeeper -s zk1,zk2,zk3
# wait some time ...
docker run -d -h zk2 --name zk2 dockmob/zookeeper -s zk1,zk3
docker run -d -h zk3 --name zk3 dockmob/zookeeper -s zk1,zk3

(它们可以在码头集线器上使用,您可以试用它们).

如果我在启动第二个和第三个容器之前等待一段时间,那么主机名zk2和zk3放在/ etc / hosts中太晚了(通过docker),Java无法找到它们:我得到java.net.UnknownHostException in zk1和zk3的zk1日志.

我在网上发现我需要禁用JVM DNS缓存才能刷新主机名,所以我在Dockerfile中引入了以下命令来更新java.security设置:

RUN grep '^networkaddress.cache.ttl=' /usr/lib/jvm/java-1.7-openjdk/jre/lib/security/java.security || echo 'networkaddress.cache.ttl=10' >> /usr/lib/jvm/java-1.7-openjdk/jre/lib/security/java.security

它将DNS TTL属性(networkaddress.cache.ttl)设置为10秒.

变量networkaddress.cache.negative.ttl已设置为其默认值(10).

行为不会改变.我反复得到很多java.net.UnknownHostException.

可能是问题的原因是什么?

最佳答案
在我的情况下(java应用程序在docker中运行时失败了java.net.UnknownHostException),原因是我使用了–network = none docker flag(通过dhcp和pipework获取ip / hostname).在这种情况下,docker不会自动添加到/ etc / hosts条目中

127.0.0.1 15e326aecf84

而getCanonicalHostName()Java函数抛出了这个异常.

可能的解决方案:

>通过docker run parameter –hosname = your-hostname.com将主机名条目添加到/ etc / hosts文件
>切换到docker管理的网络配置

猜你在找的Docker相关文章