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).