Oto prosty plik Dockerfile

FROM phusion/baseimage:0.9.19
RUN echo nameserver 10.0.0.1 > /etc/resolv.conf
RUN cat /etc/resolv.conf 

Wydaję polecenie:

docker build .

Otrzymuję ten wynik:

Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM phusion/baseimage:0.9.19
 ---> c39664f3d4e5
Step 2/3 : RUN echo nameserver 193.205.160.3 > /etc/resolv.conf
 ---> Running in ffa4ed664323
Removing intermediate container ffa4ed664323
 ---> 91d2456bb9d7
Step 3/3 : RUN cat /etc/resolv.conf
 ---> Running in cd6463980f69
# This file is managed by man:systemd-resolved(8). Do not edit.
#
# This is a dynamic resolv.conf file for connecting local clients directly to
# all known uplink DNS servers. This file lists all configured search domains.
#
# Third party programs must not access this file directly, but only through the
# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,
# replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.

# No DNS servers known.

nameserver 8.8.8.8
nameserver 8.8.4.4
Removing intermediate container cd6463980f69
 ---> 089e36d3d140
Successfully built 089e36d3d140

Najwyraźniej plik nie zawiera tekstu, którego oczekiwałem.

Przepraszam, jestem nowy w Dockerze. Czy ktoś wie, co robię źle? Dziękuję Ci.

Używam Ubuntu 18.04 i zainstalowałem docker z przystawką.

0
vvigilante 19 listopad 2019, 23:07

2 odpowiedzi

Plik /etc/resolv.conf jest zarządzany przez Docker i jest wstrzykiwany do każdego uruchamianego kontenera. Każda linia RUN jest wykonywana w nowym kontenerze. Dlatego podczas drugiej linii RUN tworzony jest nowy kontener i do niego jest wstrzykiwana nowa kopia /etc/resolv.conf. Aby zarządzać DNS w utworzonych kontenerach, istnieje kilka opcji:

  1. docker run --dns 10.0.0.1 your_image doda wpis DNS do pojedynczego kontenera
  2. Dodanie { "dns": ["10.0.0.1"] } do /etc/docker/daemon.json i ponowne uruchomienie silnika Dockera (zazwyczaj za pomocą systemctl restart docker) ustawi nowe domyślne dla wszystkich kontenerów docker i może zostać zastąpione powyższą opcją.
  3. Aktualizacja hosta /etc/resolv.conf wpłynie na kontenery, które rozpocznie, zakładając, że nie wykonano żadnego z powyższych.

Zastrzeżenie, druga i trzecia opcja dotyczą dockera zainstalowanego na hoście, a instalacja oparta na przystawce może mieć na nie wpływ.

1
BMitch 19 listopad 2019, 23:32
Dziękuję za jasne wyjaśnienie. Żadna z 3 opcji nie ma zastosowania w moim przypadku. 1. Potrzebuję, aby DNS działał podczas fazy budowania, ponieważ kolejne kroki wymagają apt do zainstalowania pakietów. 2.Zrobiłem to, ale to nie działa. 3. Czytałem, że resolv.conf jest wstrzykiwany na podstawie tego z hosta: w moim przypadku tak się nie dzieje.
 – 
vvigilante
20 listopad 2019, 01:31
github.com/docker/libnetwork/issues/2187 Ten problem opisuje problem, który doświadczam. Wygląda na to, że rozwiązaniem mojego problemu może być dodanie "echo nameserver 193.205.160.3 > /etc/resolv.conf && " do każdego polecenia RUN, które wymaga dostępu do Internetu. Przynajmniej dopóki ktoś nie naprawi problemu.
 – 
vvigilante
20 listopad 2019, 01:39
Jestem prawie pewien, że problem z 2 i 3 dla Ciebie jest spowodowany szybką warstwą izolacji. Zobacz następujący problem dotyczący przystawki, aby dowiedzieć się, jak zaktualizować tam plik daemon.json, ale zdaj sobie sprawę, że to ustawienie należy ponownie zastosować po każdej aktualizacji. Zarządzanie dokiem może być łatwiejsze, gdy jest ono zainstalowane bezpośrednio na hoście. github.com/docker/docker-snap/issues/22
 – 
BMitch
20 listopad 2019, 03:52

Nie jestem pewien w 100%, ale czy brakuje cudzysłowów?

FROM phusion/baseimage:0.9.19
RUN echo 'nameserver 10.0.0.1' > /etc/resolv.conf
RUN cat /etc/resolv.conf 
0
Mario 19 listopad 2019, 23:22