Почему сборка Docker запускает команду в промежуточном контейнере, который затем удаляется, в результате чего команда игнорируется? - PullRequest
0 голосов
/ 23 апреля 2019

По причинам, по которым я не могу определить адрес сервера имен по умолчанию для докера, примененный к контейнеру Linux, из-за невозможности разрешить и внешние адреса.Я пытаюсь обновить адрес сервера имен с помощью команды sed в файле resolv.conf, но после запуска команды появляется окно настройки для удаления образа, на котором он был запущен, в результате чего сервер имен не обновляется.

КогдаDocker build создает контейнер Linux на моем компьютере с Windows, в результате чего полученный контейнер имеет значение сервера имен в resolv.conf, равное 192.168.65.1.Я не могу разрешить любой урис с таким набором.Я не могу даже пинговать google.com.Если я обновлю сервер имен, чтобы использовать DNS от Google, 8.8.8.8, я смогу пропинговать другие хосты и успешно запустить команды, которые начали проблему (восстановление dotnet).

Я создал образ, который скопировал мои файлы в /src, а затем запустил его в интерактивном режиме, чтобы попытаться отладить.Я исправил свою проблему, выполнив следующие команды

# copy resolv.conf because I can't run sed on it directly
RUN cp /etc/resolv.conf /etc/resolv.conf.temp
# make my change to the temp file
RUN sed -i 's/192.168.65.1/8.8.8.8/' /etc/resolv.conf.temp
# copy the modified file over original
RUN cp /etc/resolv.conf.temp /etc/resolv.conf    

Работая в интерактивном режиме в контейнере, затем я могу успешно вызвать восстановление dotnet для моих файлов src.

Однако, когда я включаю эти инструкции в Dockerfileи создайте образ, в котором происходит копирование, команда sed выполняется во временном файле, и команда copyover, кажется, происходит, но результирующий образ все еще имеет исходное значение сервера имен 192.168.65.1.

Добавление этой команды после второйcp:

RUN cat /etc/resolv.conf

Подтверждает, что при запуске команды cat исходное содержимое resolv.conf не повреждено.

Вот соответствующая часть вывода сборки:

Step 9/12 : RUN cp /etc/resolv.conf /etc/resolv.conf.temp
 ---> Running in cf8e037f5675
Removing intermediate container cf8e037f5675

 ---> 53f1c8bb86c6
Step 10/12 : RUN sed -i 's/192.168.65.1/8.8.8.8/' /etc/resolv.conf.temp
 ---> Running in 14b6a8381261
Removing intermediate container 14b6a8381261
 ---> 22039e11f812

Step 11/12 : RUN cp /etc/resolv.conf.temp /etc/resolv.conf
 ---> Running in 46d295d869bf
Removing intermediate container 46d295d869bf
 ---> ea1a18576f87

Step 12/12 : RUN cat /etc/resolv.conf
 ---> Running in 6cb4726e58cb
# This configuration is written to the config.iso
nameserver 192.168.65.1
search mycompany.local
domain mycompany.local
Removing intermediate container 6cb4726e58cb
 ---> 5ad060514a74
Successfully built 5ad060514a74

Я ожидаю, что во встроенном образе будет установлено новое значение сервера имен из шагов 10 и 11, но это не так, похоже, что работа происходит, но затем промежуточное изображение отбрасывается, и я не понимаю, почему и чтоправильное исправление.

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

Вы можете изменить настройки DNS контейнера после построения его образа, ср. Докер документы .

Минимальный пример:

Dockerfile:

FROM alpine

CMD ["cat", "/etc/resolv.conf"]

В той же папке запустите:

docker build --tag foo . && docker run --rm --dns-search=foo.bar --dns=8.8.8.8 foo

Вывод покажет:

search foo.bar
nameserver 8.8.8.8
0 голосов
/ 23 апреля 2019

Name-серверы могут быть добавлены в Docker-контейнер, передав их демону Docker.

В файле /etc/docker/daemon.json добавьте "dns":["172.16.3.241", "127.0.0.1", "8.8.8.8", "8.8.4.4"] или добавьте dns как --dns 127.0.0.1 --dns 8.8.8.8 --dns 8.8.4.4 к демону Docker.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...