202 votes

Comment mettre à jour le fichier /etc/hosts dans l'image Docker pendant la "construction du docker" ?

Je veux mettre à jour mon /etc/hosts pendant le "docker build".

J'ai ajouté la ligne ci-dessous dans le Dockerfile mais il n'y a pas de mise à jour. /etc/hosts et ne donne aucune erreur.

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

Je dois mettre à jour /etc/hosts . Quelqu'un peut-il me donner des conseils à ce sujet ?

0 votes

Utilisez-vous boot2docker pour exécuter votre construction docker ?

0 votes

Non, j'utilise la version Linux de docker 1.8.

1 votes

Et lorsque vous exécutez votre image en tant que conteneur, son /etc/hosts est inchangé ? Ou bien faites-vous référence à votre hôte Linux /etc/hosts ?

260voto

VonC Points 414372

Avec une version plus récente de Docker, cela peut être fait avec docker-compose et sa fonction extra_hosts directive

Ajouter des mappages de noms d'hôtes.
Utilisez les mêmes valeurs que le docker run client --add-host paramètre (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/hosts de votre conteneur lors de son exécution, plutôt que lors de sa construction.


Avec Docker 17.x+, vous disposez d'une docker build --add-host mentionné en dessous de mais, comme indiqué dans numéro 34078 et en cette réponse :

Le site --add-host pendant la construction est conçue pour permettre de remplacer un hôte pendant la construction, mais pas pour persister cette configuration dans l'image.

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

  • Exécuter un DNS interne ; vous pouvez définir le serveur DNS par défaut à utiliser dans le démon ; de cette façon, chaque conteneur lancé utilisera automatiquement le DNS configuré par défaut.
  • Utilisez docker compose et fournissez un docker-compose.yml à vos développeurs.
    Le fichier docker compose vous permet de spécifier toutes les options qui doivent être utilisées lors du démarrage d'un conteneur. Ainsi, les développeurs peuvent se contenter de docker compose pour démarrer le conteneur avec toutes les options qu'ils doivent définir.

30 votes

Je veux changer /etc/hosts dans l'image docker.

1 votes

@PrakashSingh Je suis d'accord, mais cela ne semble pas facile à faire.

2 votes

@PrakashSingh Vous pouvez ouvrir une instance de bash sur la machine via la fonction docket exec -it <container name> /bin/bash puis mettez à jour le conteneur hôte de docker sous /ect/host avec votre éditeur de ligne de commande préféré (vim, emacs, nano, echo '' . >>/>).

40voto

Shubham Singh Points 141

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

Cependant, les éléments suivants peuvent être utilisés pour atteindre le même objectif :

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

Il faut noter ici l'utilisation de exec comme le suggère la documentation de Docker. L'utilisation de exec fera de la commande java le PID 1 du conteneur. Les interruptions de Docker ne répondront qu'à cela.

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

1 votes

Ty ! c'est une excellente solution

2 votes

Si vous cherchez une solution kubenetes, vous pouvez utiliser hostAliases. kubernetes.io/docs/concepts/services-networking/ tout comme docker compose extra_hosts.

0 votes

Plus précisément, ENTRYPOINT n'est pas une instruction pour l'image. Il marque seulement un point d'entrée lorsque nous exécutons un conteneur à partir de cette image, ce qui signifie que l'entrée des hôtes 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.

29voto

Bill Cheng Points 342

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

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

Pour plus de détails sur la façon d'utiliser docker build avec le --add-host drapeau, veuillez visiter : https://docs.docker.com/edge/engine/reference/commandline/build/

3 votes

Le site --add-host est disponible sur Docker 12 sous CentOS.

10 votes

Je veux souligner que "l'hôte qui est ajouté avec ce drapeau est seulement utilisé pendant la construction ; il ne doit délibérément pas persister dans l'image". github.com/moby/moby/issues/34078

15voto

Remy Points 41

Puisque cette question apparaît toujours comme première réponse dans Google, je vais proposer une solution possible.

Commande extraite de 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"

0 votes

Non pertinent, mais toujours utile. Merci.

3 votes

Lorsque vous redémarrez le conteneur, c'est écrasé avec l'original ! !!

12voto

Asad Shakeel Points 130

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 suis en train de cartographier example.com vers localhost 127.0.0.1 et son fonctionnement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X