Comment mettre à jour le fichier / etc / hosts dans l'image Docker pendant la «build du docker»

106

Je souhaite mettre à jour mon /etc/hostsfichier lors de la "construction du docker".

J'ai ajouté la ligne ci-dessous dans Dockerfile mais cela ne met pas à jour le /etc/hostsfichier ni ne donne aucune erreur.

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

J'ai besoin de mettre à jour /etc/hosts. Quelqu'un peut-il suggérer à ce sujet?

Prakash
la source
Utilisez-vous boot2docker pour exécuter votre build docker?
VonC du
Non, j'utilise la version Linux de docker 1.8.
Prakash du
1
Et lorsque vous exécutez votre image en tant que conteneur, son / etc / hosts est inchangé? Ou faisiez-vous référence à votre hôte Linux / etc / hosts?
VonC le
4
Pendant la construction de docker, l'image est construite avec succès, mais lorsque j'exécute un conteneur en utilisant la même image et que j'ai vérifié le fichier / etc / hosts, les modifications n'étaient pas là.
Prakash du

Réponses:

141

Avec une version plus récente de docker, cela pourrait être fait avec docker-compose et sa extra_hostsdirective

Ajoutez des mappages de noms d'hôte.
Utilisez les mêmes valeurs que le paramètre docker runclient--add-host (qui devrait déjà être disponible pour docker 1.8).

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

En bref: modifier /etc/hostsvotre conteneur lors de son exécution, pas le construire.


Avec Docker 17.x +, vous avez un docker build --add-hostmentionné ci - dessous , mais, comme commenté dans le numéro 34078 et dans cette réponse :

La --add-hostfonctionnalité lors de la génération est conçue pour autoriser le remplacement d'un hôte lors de la génération, mais pas pour conserver cette configuration dans l'image.

Les solutions mentionnées font référence au docker-compose que je suggérais ci-dessus:

  • Exécutez un DNS interne; vous pouvez définir le serveur DNS par défaut à utiliser dans le démon; de cette façon, chaque conteneur démarré utilisera automatiquement le DNS configuré par défaut
  • Utilisez docker compose et fournissez un docker-compose.ymlà vos développeurs.
    Le fichier de composition du docker vous permet de spécifier toutes les options à utiliser lors du démarrage d'un conteneur, afin que les développeurs puissent simplement composer le docker pour démarrer le conteneur avec toutes les options dont ils ont besoin pour définir.
VonC
la source
2
je veux changer / etc / hosts dans l'image docker.
Prakash du
1
@PrakashSingh Je suis d'accord, mais cela ne semble pas facile à faire.
VonC du
1
@PrakashSingh Vous pouvez ouvrir une instance bash sur la machine via le docket exec -it <container name> /bin/bash, puis mettre à jour l'hôte du conteneur du docker sous / ect / host avec votre éditeur de ligne de commande préféré (vim, emacs, nano, echo ''. >> />).
NateAGeek
@PrakashSingh Oui, nous pouvons (cela semble familier ...). Mais cela ressemble à une sorte de piratage pour Docker lorsque nous changeons l'entrée d'hôtes en construisant une image, pas en exécutant un conteneur. La conception du réseau Docker est basée sur les applications (de docker.com). Étant donné que l'entrée d'hôtes fait partie du réseau docker, nous ferions mieux de la définir lors de l'exécution d'un conteneur à partir d'une image. Si vous avez vraiment besoin d'ajouter une entrée d'hôtes, vous ne les ajoutez pas en créant une image à chaque fois, vous les ajoutez une fois à l'image de base. C'est la meilleure pratique.
Light.G
2
Pour résoudre un problème avec rocker / shiny install.packages lors de la construction de docker --add-host: cran.rstudio.com: <IPaddress> a résolu le problème pour moi.
bvanlew
25

Vous ne pouvez pas modifier le fichier hôte dans l'image à l'aide echode l' RUNétape car le démon docker conservera le fichier (/ etc / hosts) et son contenu (entrée hosts) lorsque vous démarrez un conteneur à partir de l'image.

Cependant, ce qui suit peut être utilisé pour obtenir la même chose:

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 clé à noter ici est l'utilisation de la execcommande comme le suggère la documentation de docker. L'utilisation de exec rendra la commande java comme PID 1 pour le conteneur. Les interruptions Docker ne répondront qu'à cela.

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

Shubham Singh
la source
ty! c'est une excellente solution
xero
1
Si vous recherchez une solution kubenetes, vous pouvez utiliser hostAliases. kubernetes.io/docs/concepts/services-networking/... tout comme docker compose extra_hosts.
Shubham Singh
Plus précisément, ce ENTRYPOINTn'est pas une instruction pour l'image. Il ne marque un point d'entrée que lorsque nous exécutons un conteneur à partir de cette image, ce qui signifie que l'entrée hosts n'existe qu'après l'exécution du conteneur. Je ne pense pas que l'exigence soit essentielle. Il doit y avoir un malentendu.
Light.G
17

Je pense que docker a récemment ajouté le --add-hostdrapeau à la construction de docker, ce qui est vraiment génial.

[Modifier] Cette fonctionnalité a donc été mise à jour le 17.04.0-ce

Pour plus de détails sur l'utilisation docker builddu --add-hostdrapeau, veuillez visiter: https://docs.docker.com/edge/engine/reference/commandline/build/

Bill Cheng
la source
1
La --add-hostfonctionnalité est disponible sur Docker 12 sur CentOS.
chutz le
1
Je tiens à souligner que "l'hôte ajouté avec cet indicateur n'est utilisé que pendant la construction; il ne doit délibérément pas persister dans l'image" github.com/moby/moby/issues/34078
Sida Zhou
10

Comme cela apparaît toujours comme une première réponse dans Google, je vais apporter une solution possible.

La commande prise d' ici a étonnamment fonctionné pour moi (Docker 1.13.1, Ubuntu 16.04):

docker exec -u 0 <container-name> /bin/sh -c "echo '<ip> <name> >> /etc/hosts"
Remy
la source
Pas pertinent mais toujours précieux. THX.
Light.G
4

Si cela est utile pour quelqu'un, la HOSTALIASESvariable env a fonctionné pour moi:

echo "fakehost realhost" > /etc/host.aliases
export HOSTALIASES=/etc/host.aliases
user10805445
la source
3
ne confondez-vous pas docker avec kubernetes? Je ne vois aucune variable HOSTALIASES dans la documentation de docker
Adrien Lemaire
4

Vous pouvez le faire avec la commande suivante au moment de l'exécution de docker

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

Ici, je mappe example.comsur localhost 127.0.0.1et son fonctionnement.

Asad Shakeel
la source
3

J'utilise AWS Elasticbeanstalk + Docker + Supervisord.

Réponse rapide

Ajoutez simplement du code Dockerfile.

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

Réponse complète

  1. Préparez votre propre hostsfichier que vous souhaitez ajouter au conteneur 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. COPIEZ votre hostsfichier dans le conteneur en ajoutant la ligne suivante dans leDockerfile
COPY hosts /etc/hosts_extra
  1. Si vous savez comment utiliser ENTRYPOINTor CMDou CRONjob, intégrez-y la ligne de commande suivante ou au moins exécutez-la dans le conteneur en cours d'exécution:
cat /etc/hosts_extra >> etc/hosts;
  1. Vous ne pouvez pas ajouter les éléments suivants dans le Dockerfilecar la modification sera perdue:
RUN cat /etc/hosts_extra >> etc/hosts;
Jansen Simanullang
la source
0

Vous pouvez utiliser l' option --add-host pendant l'exécution du docker.

Pour votre cas, utilisez: docker run --add-host mynginx: 192.168.33.11 [image_name]: [tag]

Cela mettra à jour votre / etc / hosts

vous pouvez le vérifier en utilisant les commandes suivantes:

  • docker exec -it [id_conteneur] sh

si sh ne fonctionne pas pour vous, vous pouvez essayer bash ou / bin / sh ou / bin / bash

  • cd etc
  • hôtes de chat
Karan Raj
la source
-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
  • l'utilisateur doit su
Dernier nom
la source
-2

La suite a fonctionné pour moi en montant le fichier pendant l'exécution de docker au lieu de la construction de docker

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

la source
l'ajout d'un fichier à l'aide d'un volume crée une complexité supplémentaire et chaque hôte doit avoir le fichier.
Shubham Singh
-11

Juste une réponse rapide pour exécuter votre conteneur en utilisant:

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

une fois le conteneur ouvert:

cd ..

puis

`cd etc`

et alors tu peux

cat hosts

ou:

apt-get update
apt-get vim

ou n'importe quel éditeur que vous aimez et ouvrez-le dans vim, ici vous pouvez modifier votre ip de démarrage en 0.0.0.0

Esk Aie
la source