Docker上的java.net.UnknownHostException
我正在尝试为ZooKeeper创建docker容器并在集群模式下对其进行配置(完整的代码在此处和此处)。
容器基于Alpine Linux(Docker Hub上为alpine: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,zk2,zk3
docker run -d -h zk3 --name zk3 dockmob/zookeeper -s zk1,zk2,zk3
(它们在docker hub上可用,您可以尝试)。
如果我等待一段时间开始的第二和第三个容器,那么主机名之前zk2
并zk3
放入/etc/hosts
太晚(由码头工人)和Java是无法找到他们:我得到java.net.UnknownHostException
在日志zk1
两个zk2
和zk3
。
我在网上发现我需要禁用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
反复得到很多。
可能是什么原因造成的?
回答:
通过切换到Oracle JRE 8并在Dockerfile中使用以下技巧,我设法摆脱了DNS问题:
RUN echo 'hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4' >> /etc/nsswitch.conf
我在Docker Hub上创建了一个工作正常的Java 8
docker容器(代码在github上)。
以上是 Docker上的java.net.UnknownHostException 的全部内容, 来源链接: utcz.com/qa/434079.html