So aktualisieren Sie die Datei / etc / hosts im Docker-Image während des Docker-Builds

106

Ich möchte meine /etc/hostsDatei während des "Docker-Builds" aktualisieren .

Ich habe die folgende Zeile in Dockerfile hinzugefügt, aber es wird weder die /etc/hostsDatei aktualisiert noch ein Fehler ausgegeben .

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

Ich muss aktualisieren /etc/hosts. Kann jemand dies vorschlagen?

Prakash
quelle
Verwenden Sie boot2docker, um Ihren Docker-Build auszuführen?
VonC
Nein, ich verwende die Linux-Version von Docker 1.8.
Prakash
1
Und wenn Sie Ihr Image als Container ausführen, bleibt dessen / etc / hosts unverändert? Oder haben Sie Ihren Linux-Host / etc / hosts empfohlen?
VonC
4
Während des Docker-Builds wird das Image erfolgreich erstellt. Wenn ich jedoch einen Container mit demselben Image ausführe und die Datei / etc / hosts überprüft habe, waren keine Änderungen vorhanden.
Prakash

Antworten:

141

Mit einer neueren Version von Docker könnte dies mit Docker-Compose und seiner Direktive geschehenextra_hosts

Fügen Sie Hostnamenzuordnungen hinzu.
Verwenden Sie dieselben Werte wie der docker runClient- --add-hostParameter (der für Docker 1.8 bereits verfügbar sein sollte).

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

Kurz gesagt: Ändern Sie /etc/hostsIhren Container, wenn Sie ihn ausführen, und erstellen Sie ihn nicht.


Mit Docker 17.x + haben Sie unten eine docker build --add-hostErwähnung , aber wie in Ausgabe 34078 und in dieser Antwort kommentiert :

Die --add-hostFunktion während des Builds soll das Überschreiben eines Hosts während des Builds ermöglichen, diese Konfiguration jedoch nicht im Image beibehalten.

Die genannten Lösungen beziehen sich auf die Docker-Komposition, die ich oben vorgeschlagen habe:

  • Führen Sie ein internes DNS aus. Sie können den Standard-DNS-Server festlegen, der im Daemon verwendet werden soll. Auf diese Weise verwendet jeder gestartete Container standardmäßig automatisch das konfigurierte DNS
  • Verwenden Sie Docker Compose und stellen Sie docker-compose.ymlIhren Entwicklern eine zur Verfügung.
    In der Docker-Erstellungsdatei können Sie alle Optionen angeben, die beim Starten eines Containers verwendet werden sollen, sodass Entwickler nur Docker-Kompositionen erstellen können, um den Container mit allen Optionen zu starten, die sie festlegen müssen.
VonC
quelle
2
Ich möchte / etc / hosts im Docker-Image ändern.
Prakash
1
@PrakashSingh Ich stimme zu, aber das scheint nicht einfach zu sein.
VonC
1
@PrakashSingh Sie können eine Bash-Instanz auf dem Computer über das öffnen docket exec -it <container name> /bin/bashund dann den Container-Host des Dockers unter / ect / host mit Ihrem bevorzugten Befehlszeileneditor (vim, emacs, nano, echo ''. >> />) aktualisieren.
NateAGeek
@PrakashSingh Ja, wir können (kommt mir bekannt vor ...). Aber es sieht für Docker wie ein Hack aus, wenn wir den Host-Eintrag ändern, indem wir ein Image erstellen und keinen Container ausführen. Das Docker-Netzwerkdesign ist anwendungsgesteuert (von docker.com). Da der Host-Eintrag Teil des Docker-Netzwerks ist, sollten Sie ihn besser definieren, wenn Sie einen Container aus einem Image ausführen. Wenn Sie wirklich einen Host-Eintrag hinzufügen müssen, fügen Sie ihn nicht jedes Mal durch Erstellen eines Images hinzu, sondern fügen ihn einmal zum Basis-Image hinzu. Das ist die beste Vorgehensweise.
Light.G
2
Um ein Problem mit rocker / shiny install.packages während des Docker-Builds zu lösen --add-host: cran.rstudio.com: <IP-Adresse> hat das Problem für mich gelöst.
Bvanlew
25

Sie können die Hostdatei im Image nicht echoin RUNSchritt ändern, da der Docker-Daemon die Datei (/ etc / hosts) und ihren Inhalt (Hosts-Eintrag) verwaltet, wenn Sie einen Container aus dem Image starten.

Folgendes kann jedoch verwendet werden, um dasselbe zu erreichen:

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

Der Schlüssel, der hier zu beachten ist, ist die Verwendung von execBefehlen, wie in der Docker-Dokumentation vorgeschlagen. Bei Verwendung von exec wird der Java-Befehl als PID 1 für den Container festgelegt. Docker-Interrupts reagieren nur darauf.

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

Shubham Singh
quelle
ty! Dies ist eine großartige Lösung
Xero
1
Wenn Sie nach einer kubenetes-Lösung suchen, können Sie hostAliases verwenden. kubernetes.io/docs/concepts/services-networking/… genau wie Docker extra_hosts komponieren.
Shubham Singh
Genauer gesagt, ENTRYPOINTist keine Anweisung für das Bild. Es markiert nur einen Einstiegspunkt, wenn wir einen Container von diesem Image aus ausführen. Dies bedeutet, dass der Host-Eintrag erst existiert, nachdem der Container ausgeführt wurde. Ich denke nicht, dass die Anforderung wesentlich ist. Es muss ein Missverständnis geben.
Light.G
17

Ich denke, Docker hat kürzlich die --add-hostFlagge zum Docker-Build hinzugefügt , was wirklich großartig ist.

[Bearbeiten] Diese Funktion wurde am 17.04.0-ce aktualisiert

Weitere Informationen zur Verwendung docker buildder --add-hostFlagge finden Sie unter: https://docs.docker.com/edge/engine/reference/commandline/build/

Bill Cheng
quelle
1
Die --add-hostFunktion ist in Docker 12 unter CentOS verfügbar.
Chutz
1
Ich möchte betonen, dass "der Host, der mit diesem Flag hinzugefügt wurde, nur während des Builds verwendet wird; er sollte absichtlich nicht im Image verbleiben
Sida Zhou
10

Da dies immer noch als erste Antwort in Google auftaucht, werde ich eine mögliche Lösung beitragen.

Der Befehl von hier hat überraschenderweise für mich funktioniert (Docker 1.13.1, Ubuntu 16.04):

docker exec -u 0 <container-name> /bin/sh -c "echo '<ip> <name> >> /etc/hosts"
Remy
quelle
Nicht relevant, aber dennoch wertvoll. Vielen Dank.
Light.G
4

Wenn dies für jemanden nützlich ist, hat die HOSTALIASESenv-Variable für mich funktioniert:

echo "fakehost realhost" > /etc/host.aliases
export HOSTALIASES=/etc/host.aliases
user10805445
quelle
3
Verwechseln Sie Docker nicht mit Kubernetes? Ich sehe keine HOSTALIASES-Variable in der Docker-Dokumentation
Adrien Lemaire
4

Sie können den folgenden Befehl zum Zeitpunkt der Ausführung von Docker ausführen

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

Hier example.comordne ich localhost 127.0.0.1und seiner Arbeitsweise zu.

Asad Shakeel
quelle
3

Ich verwende AWS Elasticbeanstalk + Docker + Supervisord.

Schnelle Antwort

Fügen Sie einfach Code hinzu Dockerfile.

CMD echo 123.123.123.123 this_is_my.host >> /etc/hosts; supervisord -n;
Jay Lim
quelle
1

Vollständige Antwort

  1. Bereiten Sie Ihre eigene hostsDatei vor, die Sie dem Docker-Container hinzufügen möchten.
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. KOPIEREN Sie Ihre hostsDatei in den Container, indem Sie die folgende Zeile in das Feld einfügenDockerfile
COPY hosts /etc/hosts_extra
  1. Wenn Sie wissen, wie man ENTRYPOINToder CMDoder CRONJob verwendet, fügen Sie die folgende Befehlszeile ein oder führen Sie diese zumindest im laufenden Container aus:
cat /etc/hosts_extra >> etc/hosts;
  1. Sie können Folgendes nicht hinzufügen, Dockerfileda die Änderung verloren geht:
RUN cat /etc/hosts_extra >> etc/hosts;
Jansen Simanullang
quelle
0

Sie können den --add-Host verwenden Option während des Docker-Laufs verwenden.

Verwenden Sie für Ihren Fall: docker run --add-host mynginx: 192.168.33.11 [Bildname]: [Tag]

Dadurch werden Ihre / etc / hosts aktualisiert

Sie können dies mit den folgenden Befehlen überprüfen:

  • Docker exec -it [container_id] sh

Wenn sh für Sie nicht funktioniert, können Sie bash oder / bin / sh oder / bin / bash ausprobieren

  • CD etc.
  • Katzenwirte
Karan Raj
quelle
-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"
  • die Info
  • Benutzer muss su
Name Last
quelle
-2

Das Folgende hat für mich funktioniert, indem die Datei während des Docker-Laufs anstelle des Docker-Builds bereitgestellt wurde

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

quelle
Das Hinzufügen einer Datei mithilfe von Volume führt zu zusätzlicher Komplexität, und jeder Host muss über die Datei verfügen.
Shubham Singh
-11

Nur eine kurze Antwort, um Ihren Container mit folgenden Funktionen auszuführen:

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

Sobald der Behälter geöffnet ist:

cd ..

dann

`cd etc`

und dann kannst du

cat hosts

oder:

apt-get update
apt-get vim

oder einen beliebigen Editor, den Sie mögen, und öffnen Sie ihn in vim. Hier können Sie beispielsweise Ihre Start-IP auf 0.0.0.0 ändern

Esk Aie
quelle