Docker переопределяет мой файл /etc/resolv.conf внутри контейнеров

17

Я хочу установить для моего resin/rpi-raspbian:jessieконтейнера /etc/resolv.conf:

nameserver 208.67.222.222
nameserver 208.67.220.220

Мой Dockerfile имеет следующую строку:

ADD resolv.conf /etc/resolv.conf

Этот добавленный файл содержит правильные серверы имен.

Мой хост Docker /etc/resolv.confсодержит правильную информацию.

Я запускаю контейнер так:

docker run -itd --cap-add=NET_ADMIN --device /dev/net/tun \
-v /home/pi/share/ovpn:/ovpn \
--privileged --network=internet_disabled --name vpn-client \
--dns=208.67.222.222 \
openvpn-client_nat-gateway /bin/bash

Несмотря на все это, контейнер дает такой вывод:

root@642b0f4716ba:/# cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0

Только после того, как я вручную изменил resolv.conf из контейнера (или с помощью docker exec), он выглядит правильно.

Я бы предпочел избежать исправления с помощью команды exec. У кого-нибудь есть идея, что здесь происходит?

Дункан Маршалл
источник
В их вики описано несколько случаев, которые могут объяснить вашу ситуацию.
Джули Пеллетье
Посмотрите на мой вопрос и ответ.
Зейнаб Аббасимазар

Ответы:

14

AFAIK, docker перезаписывает некоторые файлы в изображении при запуске , даже если они были добавлены в Dockerfile. Это наверняка включает в себя /etc/hosts, и, скорее всего, то же самое происходит и для /etc/resolv.conf. Это, по-видимому, используется для правильной сборки по умолчанию «внутренней» сети Docker (чтобы изображения видели друг друга, но не хост, и т. Д.) Если вы действительно уверены, что хотите переопределить / изменить некоторые из этих файлов, я считаю, что вы должны сделать это как часть действий во время выполнения, то есть как часть CMDстроки. Например:

...
ADD resolv.conf /etc/resolv.conf.override
CMD cp /etc/resolv.conf.override /etc/resolv.conf && \
        your_old_commands...
akavel
источник
3
Это верно. /etc/resolv.confкопируется с хоста при запуске контейнера.
Висбуки
4

Как я вижу, вы используете user-defined networksи версию Docker Engine> = 1.10. Итак, из официальной документации по движку докера о Embedded DNS server in user-defined networks:

Эти IP-адреса --dns управляются встроенным DNS-сервером и не будут обновляться в файле /etc/resolv.conf контейнера.

Ваш днс должен работать, но вы не увидите ни в одном файле конфигурации.

Ссылки .

Тьяго Алмейда
источник
0

Я решил проблему, если это веб-приложение для контейнеров в Azure.

Есть 2 контейнера помощник . Куду и хозяин

меры

1. Установите ssh из файла Docker (также включите конфигурацию sshd)

2. создайте containerstart.sh (который обновляет resolv.conf)

3. Установите точку входа внутри

Теперь хост resolv.conf обновляется, и вы можете использовать любой DNS, который вы хотите

PS: Если вы не можете подобрать собственный DNS в сети, не беспокойтесь. Мы тоже не могли. Может потребоваться перезагрузка, если вы используете среду ASE

Рифат Эрдем Сахин
источник