Come aggiornare il file / etc / hosts nell'immagine Docker durante "docker build"


106

Voglio aggiornare il mio /etc/hosts file durante "docker build".

Ho aggiunto sotto la riga in Dockerfile ma non aggiorna il /etc/hostsfile né dà alcun errore.

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

Ho bisogno di aggiornare /etc/hosts. Qualcuno può suggerire su questo?


Stai usando boot2docker per eseguire la tua build docker?
VonC

No, sto usando la versione Linux di docker 1.8.
Prakash

1
E quando esegui la tua immagine come contenitore, il suo / etc / hosts non viene modificato? O stavi facendo riferimento al tuo host Linux / etc / hosts?
VonC

4
Durante la compilazione della finestra mobile, l'immagine viene creata correttamente, ma quando eseguo un container utilizzando la stessa immagine e ho controllato il file / etc / hosts, le modifiche non erano presenti.
Prakash

Risposte:


141

Con una versione più recente di docker, questo potrebbe essere fatto con docker-compose e la sua extra_hostsdirettiva

Aggiungi mappature del nome host.
Utilizza gli stessi valori del parametro docker runclient--add-host (che dovrebbe essere già disponibile per la finestra mobile 1.8).

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

In breve: modifica /etc/hostsdel tuo contenitore quando lo esegui, non costruendolo.


Con Docker 17.x +, hai un docker build --add-hostmenzionato di seguito , ma, come commentato nel numero 34078 e in questa risposta :

La --add-hostfunzionalità durante la compilazione è progettata per consentire l'override di un host durante la compilazione, ma non per rendere persistente quella configurazione nell'immagine.

Le soluzioni menzionate fanno riferimento al docker-compose che stavo suggerendo sopra:

  • Esegui un DNS interno; è possibile impostare il server DNS predefinito da utilizzare nel daemon; in questo modo ogni container avviato utilizzerà automaticamente il DNS configurato per impostazione predefinita
  • Usa docker compose e fornisci un file docker-compose.ymlai tuoi sviluppatori.
    Il file di composizione docker consente di specificare tutte le opzioni che dovrebbero essere utilizzate all'avvio di un contenitore, in modo che gli sviluppatori possano semplicemente comporre docker per avviare il contenitore con tutte le opzioni che devono impostare.

2
voglio cambiare / etc / hosts nell'immagine docker.
Prakash,

1
@PrakashSingh Sono d'accordo, ma non sembra essere facile.
VonC

1
@PrakashSingh È possibile aprire un'istanza bash sulla macchina tramite docket exec -it <container name> /bin/bash, quindi aggiornare l'host del contenitore del docker in / ect / host con il proprio editor della riga di comando preferito (vim, emacs, nano, echo ''. >> />).
NateAGeek

@PrakashSingh Sì, possiamo (suona familiare ...). Ma sembra solo una specie di hack per Docker quando modifichiamo la voce host costruendo un'immagine, non eseguendo un contenitore. La progettazione della rete Docker è basata sull'applicazione (da docker.com). Poiché la voce degli host fa parte della rete docker, è meglio definirla quando si esegue un contenitore dall'immagine. Se hai davvero bisogno di aggiungere alcune voci host, non le aggiungi creando un'immagine ogni volta, le aggiungi all'immagine di base una volta. Questa è la migliore pratica.
Light

2
Per risolvere un problema con rocker / shiny install.packages durante la compilazione del docker --add-host: cran.rstudio.com: <IPaddress> ha risolto il problema per me.
bvanlew

25

Non è possibile modificare il file host nell'immagine utilizzando echonel RUNpassaggio perché il demone docker manterrà il file (/ etc / hosts) e il suo contenuto (voce host) quando si avvia un contenitore dall'immagine.

Tuttavia, è possibile utilizzare quanto segue per ottenere lo stesso risultato:

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

La chiave da notare qui è l'uso del execcomando come suggerisce la documentazione di Docker. L'uso di exec renderà il comando java come PID 1 per il contenitore. Gli interrupt Docker risponderanno solo a questo.

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


ty! questa è un'ottima soluzione
xero

1
Nel caso tu stia cercando una soluzione kubenetes, puoi usare hostAliases. kubernetes.io/docs/concepts/services-networking/… proprio come docker compose extra_hosts.
Shubham Singh

Più precisamente, ENTRYPOINTnon è un'istruzione per l'immagine. Contrassegna un punto di ingresso solo quando eseguiamo un contenitore da questa immagine, il che significa che la voce host esiste solo dopo che il contenitore è in esecuzione. Non credo che il requisito sia essenziale. Dev'esserci un malinteso.
Light

17

Penso che Docker abbia recentemente aggiunto il file --add-host bandiera a docker build, il che è davvero fantastico.

[Modifica] Quindi questa funzione è stata aggiornata il 17.04.0-ce

Per maggiori dettagli su come utilizzare docker buildcon il --add-hostflag, visitare: https://docs.docker.com/edge/engine/reference/commandline/build/


1
La --add-hostfunzionalità è disponibile su Docker 12 su CentOS.
chutz

1
Voglio sottolineare che "l'host aggiunto con questo flag viene utilizzato solo durante la compilazione; deliberatamente non dovrebbe persistere nell'immagine" github.com/moby/moby/issues/34078
Sida Zhou

10

Poiché questa è ancora una prima risposta in Google, contribuirò alla possibile soluzione.

Il comando preso da qui ha sorprendentemente funzionato per me (Docker 1.13.1, Ubuntu 16.04):

docker exec -u 0 <container-name> /bin/sh -c "echo '<ip> <name> >> /etc/hosts"

Non rilevante ma comunque prezioso. Grazie.
Light

4

Se questo è utile per chiunque, la HOSTALIASESvariabile env ha funzionato per me:

echo "fakehost realhost" > /etc/host.aliases
export HOSTALIASES=/etc/host.aliases

3
non stai confondendo docker con kubernetes? Non vedo alcuna variabile HOSTALIASES nella documentazione di Docker
Adrien Lemaire

4

Puoi eseguire il comando seguente al momento dell'esecuzione di Docker

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

Qui sto mappando example.comsu localhost 127.0.0.1e il suo funzionamento.


3

Utilizzo AWS Elasticbeanstalk + Docker + Supervisord.

Risposta rapida

Basta aggiungere un po 'di codice Dockerfile.

CMD echo 123.123.123.123 this_is_my.host >> /etc/hosts; supervisord -n;

1

Risposta completa

  1. Prepara il tuo hostsfile che desideri aggiungere al contenitore 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. COPIA il tuo hostsfile nel contenitore aggiungendo la seguente riga nel fileDockerfile
COPY hosts /etc/hosts_extra
  1. Se sai come usare ENTRYPOINTo CMDo CRONjob, incorpora la seguente riga di comando o almeno eseguilo all'interno del contenitore in esecuzione:
cat /etc/hosts_extra >> etc/hosts;
  1. Non è possibile aggiungere quanto segue in Dockerfileperché la modifica andrà persa:
RUN cat /etc/hosts_extra >> etc/hosts;

0

Puoi usare --add-host opzione durante l'esecuzione di Docker.

Per il tuo caso usa: docker run --add-host mynginx: 192.168.33.11 [image_name]: [tag]

Questo aggiornerà il tuo / etc / hosts

puoi verificarlo utilizzando i seguenti comandi:

  • docker exec -it [container_id] sh

se sh non funziona per te, puoi provare bash o / bin / sh o / bin / bash

  • cd ecc
  • padroni di casa gatto

-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"
  • Informazioni
  • l'utente deve su

-2

Di seguito ha funzionato per me montando il file durante l'esecuzione di Docker invece di Docker Build

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

l'aggiunta di un file utilizzando il volume crea ulteriore complessità e ogni host deve avere il file.
Shubham Singh

-11

Solo una rapida risposta per eseguire il tuo contenitore utilizzando:

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

una volta aperto il contenitore:

cd ..

poi

`cd etc`

e poi puoi

cat hosts

o:

apt-get update
apt-get vim

o qualsiasi editor che ti piace e aprilo in vim, qui puoi modificare ad esempio il tuo ip di avvio in 0.0.0.0

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.