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?


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

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


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/


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"

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

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.


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;

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;

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

-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

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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.