Jak zaktualizować plik / etc / hosts w obrazie Dockera podczas „kompilacji Dockera”

106

Chcę zaktualizować mój /etc/hostsplik podczas „budowania platformy Docker”.

Dodałem poniższą linię w Dockerfile, ale nie aktualizuje /etc/hostspliku ani nie podaje żadnego błędu.

RUN echo "192.168.33.11    mynginx" >> /etc/hosts

Muszę zaktualizować /etc/hosts. Czy ktoś może coś zasugerować w tej sprawie?

Prakash
źródło
Czy używasz boot2docker do wykonania kompilacji dockera?
VonC,
Nie, używam wersji docker 1.8 dla systemu Linux.
Prakash
1
A kiedy używasz swojego obrazu jako kontenera, jego / etc / hosts pozostaje niezmieniony? A może polecałeś swojego hosta Linux / etc / hosts?
VonC,
4
Podczas kompilacji obrazu Dockera udało się zbudować, ale kiedy uruchomię kontener przy użyciu tego samego obrazu i sprawdzę plik / etc / hosts, zmian tam nie było.
Prakash

Odpowiedzi:

141

W nowszej wersji docker można to zrobić za pomocą docker-compose i jego extra_hostsdyrektywy

Dodaj mapowania nazw hostów.
Użyj tych samych wartości, co parametr docker runklienta--add-host (który powinien być już dostępny dla dockera 1.8).

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

Krótko mówiąc: modyfikuj /etc/hostsswój kontener podczas uruchamiania, a nie buduj go.


W przypadku Dockera 17.x + masz docker build --add-hostwspomniany poniżej , ale, jak skomentowano w numerze 34078 i w tej odpowiedzi :

--add-hostCechą podczas kompilacji jest zaprojektowany tak, aby nadrzędne gospodarza podczas kompilacji, ale nie utrzymują tę konfigurację w obrazie.

Wymienione rozwiązania odnoszą się do docker-compose, które sugerowałem powyżej:

  • Uruchom wewnętrzny DNS; możesz ustawić domyślny serwer DNS do użycia w demonie; w ten sposób każdy uruchomiony kontener będzie domyślnie automatycznie używał skonfigurowanego DNS
  • Użyj Docker Compose i podaj docker-compose.ymlprogramistom.
    Plik docker compose pozwala określić wszystkie opcje, które powinny być używane podczas uruchamiania kontenera, więc programiści mogą po prostu dokerować komponowanie, aby uruchomić kontener ze wszystkimi opcjami, które muszą ustawić.
VonC
źródło
2
chcę zmienić / etc / hosts w obrazie Dockera.
Prakash,
1
@PrakashSingh Zgadzam się, ale nie wydaje się to łatwe.
VonC,
1
@PrakashSingh Możesz otworzyć instancję bash na maszynie przez docket exec -it <container name> /bin/bash, a następnie zaktualizować host kontenera dockera w / ect / host za pomocą preferowanego edytora wiersza poleceń (vim, emacs, nano, echo ''. >> />).
NateAGeek
@PrakashSingh Tak, możemy (brzmi znajomo ...). Ale wygląda to po prostu na rodzaj hackowania dla Dockera, kiedy zmieniamy wpis hostów, budując obraz, a nie uruchamiając kontener. Projekt sieci Docker jest oparty na aplikacji (z witryny docker.com). Ponieważ wpis hostów jest częścią sieci Dockera, lepiej zdefiniujmy go podczas uruchamiania kontenera z obrazu. Jeśli naprawdę potrzebujesz dodać wpis o hostach, nie dodajesz ich przez tworzenie obrazu za każdym razem, dodajesz je do obrazu podstawowego raz. To jest najlepsza praktyka.
Light.G
2
Aby rozwiązać problem z rocker / shiny install.packages podczas budowania dockera --add-host: cran.rstudio.com: <IPaddress> rozwiązało problem za mnie.
wiał
25

Nie można zmodyfikować plik hosta w obrazie przy użyciu echowRUN kroku, ponieważ demon Dockera będzie utrzymywał plik (/ etc / hosts) i jego zawartość (wpis hosts) po uruchomieniu kontenera z obrazu.

Aby osiągnąć to samo, można jednak użyć następujących rozwiązań:

ENTRYPOINT ["/bin/sh", "-c" , "echo 192.168.254.10   database-server >> /etc/hosts && echo 192.168.239.62   redis-ms-server >> /etc/hosts && exec java -jar ./botblocker.jar " ]

Kluczem do zauważenia w tym miejscu jest użycie execpolecenia, jak sugeruje dokumentacja dockera. Korzystanie z exec sprawi, że polecenie java będzie traktowane jako PID 1 dla kontenera. Przerwania Dockera odpowiedzą tylko na to.

Zobacz https://docs.docker.com/engine/reference/builder/#entrypoint

Shubham Singh
źródło
ty! to jest świetne rozwiązanie
xero
1
Jeśli szukasz rozwiązania kubenetes, możesz skorzystać z hostAliases. kubernetes.io/docs/concepts/services-networking/ ... tak jak docker tworzy extra_hosts.
Shubham Singh
Dokładniej, ENTRYPOINTnie jest instrukcją dotyczącą obrazu. Zaznacza punkt wejścia tylko wtedy, gdy uruchamiamy kontener z tego obrazu, co oznacza, że ​​wpis hostów istnieje tylko po uruchomieniu kontenera. Nie sądzę, aby wymóg był niezbędny. Musi być jakieś nieporozumienie.
Light.G
17

Myślę, że docker niedawno dodał --add-host flagę do kompilacji dockera, co jest naprawdę świetne.

[Edytuj] Więc ta funkcja została zaktualizowana 17.04.0-ce

Aby uzyskać więcej informacji na temat korzystania docker buildz --add-hostflagi, odwiedź: https://docs.docker.com/edge/engine/reference/commandline/build/

Bill Cheng
źródło
1
Ta --add-hostfunkcja jest dostępna na platformie Docker 12 w systemie CentOS.
chutz
1
Chcę podkreślić, że „host, który został dodany z tą flagą, jest używany tylko podczas kompilacji; celowo nie powinien pozostawać
Sida Zhou
10

Ponieważ to wciąż pojawia się jako pierwsza odpowiedź w Google, podam możliwe rozwiązanie.

Komenda pochodzi tu zaskakująco pracował dla mnie (Döcker 1.13.1, Ubuntu 16.04):

docker exec -u 0 <container-name> /bin/sh -c "echo '<ip> <name> >> /etc/hosts"
Remy
źródło
Nieistotne, ale nadal cenne. Dzięki.
Light.G
4

Jeśli jest to przydatne dla kogoś, HOSTALIASESzmienna env zadziałała dla mnie:

echo "fakehost realhost" > /etc/host.aliases
export HOSTALIASES=/etc/host.aliases
user10805445
źródło
3
nie mylisz dockera z kubernetesem? Nie widzę żadnej zmiennej HOSTALIASES w dokumentacji dockera
Adrien Lemaire
4

Możesz to zrobić za pomocą następującego polecenia w czasie uruchamiania dockera

docker run [OPTIONS] --add-host example.com:127.0.0.1 <your-image-name>:<your tag>

Tutaj mapuję example.comna localhost 127.0.0.1i jego działanie.

Asad Shakeel
źródło
3

Używam AWS Elasticbeanstalk + Docker + Supervisord.

Szybka odpowiedź

Po prostu dodaj kod Dockerfile.

CMD echo 123.123.123.123 this_is_my.host >> /etc/hosts; supervisord -n;
Jay Lim
źródło
1

Pełna odpowiedź

  1. Przygotuj własny hostsplik, który chcesz dodać do kontenera docker;
1.2.3.4 abc.tv
5.6.7.8 domain.xyz
1.3.5.7 odd.org
2.4.6.8 even.net
  1. SKOPIUJ hostsplik do kontenera, dodając następujący wiersz wDockerfile
COPY hosts /etc/hosts_extra
  1. Jeśli wiesz, jak używać ENTRYPOINTlub CMDlub CRONzadania, włącz do niego następujący wiersz poleceń lub przynajmniej uruchom go w działającym kontenerze:
cat /etc/hosts_extra >> etc/hosts;
  1. Nie możesz dodać następujących elementów, Dockerfileponieważ modyfikacja zostanie utracona:
RUN cat /etc/hosts_extra >> etc/hosts;
Jansen Simanullang
źródło
0

Możesz użyć --add-hostPodczas uruchamiania .

W twoim przypadku użyj: docker run --add-host mynginx: 192.168.33.11 [nazwa_obrazu]: [tag]

To zaktualizuje twój / etc / hosts

możesz to sprawdzić za pomocą następujących poleceń:

  • docker exec -it [identyfikator_kontenera] sh

jeśli sh nie działa dla Ciebie, możesz spróbować bash lub / bin / sh lub / bin / bash

  • cd itp
  • gospodarze dla kotów
Karan Raj
źródło
-1
Tis is me Dockefile
FROM XXXXX
ENV DNS_1="10.0.0.1 TEST1.COM"
ENV DNS_1="10.0.0.1 TEST2.COM" 
CMD ["bash","change_hosts.sh"]`

#cat change_hosts.sh
su - root -c "env | grep DNS | akw -F "=" '{print $2}' >> /etc/hosts"
  • info
  • użytkownik musi su
Wymień ostatnie
źródło
-2

Poniższe pracowały dla mnie, montując plik podczas uruchamiania platformy docker zamiast kompilacji docker

docker service create --name <name>  --mount type=bind,source=/etc/hosts,dst=/etc/hosts   <image>

źródło
dodanie pliku przy użyciu woluminu dodatkowo komplikuje i każdy host musi mieć ten plik.
Shubham Singh,
-11

Szybka odpowiedź, aby uruchomić kontener przy użyciu:

docker exec -it <container name> /bin/bash

po otwarciu pojemnika:

cd ..

następnie

`cd etc`

a potem możesz

cat hosts

lub:

apt-get update
apt-get vim

lub dowolny edytor, który ci się podoba i otwórz go w vimie, tutaj możesz zmienić, powiedzmy, twój startowy ip na 0.0.0.0

Esk Aie
źródło