java.сеть.UnknownHostException на ДОКере
я пытаюсь создать контейнеры docker для ZooKeeper и настроить их в режиме кластера (полный код здесь и здесь).
контейнеры основаны на Alpine Linux (alpine:3.2 на Docker Hub), но проблема, которую я собираюсь описать, происходит также с официальным контейнером 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
.
я нашел в интернете, что мне нужно отключить кэш DNS JVM для обновления имен хостов, поэтому я ввел следующую команду в 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
он устанавливает свойство TTL DNS (networkaddress.cache.ttl
) к 10
секунд.
переменная networkaddress.cache.negative.ttl
уже установлено значение по умолчанию (10
).
поведение не меняется. Я получаю много java.net.UnknownHostException
неоднократно.
что может быть причиной проблемы?
2 ответов
в моем случае (приложение java не удалось с java.net.UnknownHostException
при запуске в docker), причина в том, что я использовал --network=none
флаг docker (получение ip/hostname через dhcp и pipework). В этом случае docker не добавляет автоматически в /etc/hosts
запись типа
127.0.0.1 15e326aecf84
и getCanonicalHostName()
функция Java выбросила это исключение.
возможные решения:
- добавить запись имя через
мне удалось избавиться от проблем DNS, переключившись на Oracle JRE 8 и используя следующий хак в Dockerfile:
RUN echo 'hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4' >> /etc/nsswitch.conf
Я создал рабочий контейнер контейнера docker Java 8 на Docker Hub (код по github).