web-dev-qa-db-fra.com

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

Je souhaite mettre à jour mon fichier /etc/hosts pendant la "construction du menu fixe".

J'ai ajouté la ligne ci-dessous dans Dockerfile mais il ne s'agit ni de mettre à jour le fichier /etc/hosts ni de donner d'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?

72
Prakash

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

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

_extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"
_

En bref: modifiez _/etc/hosts_ de votre conteneur lors de son exécution, sans le générer.


Avec Docker 17.x +, vous avez docker build --add-Host mentionné ci-dessous , mais, comme indiqué dans numéro 34078 et dans cette réponse :

La fonctionnalité _--add-Host_ au cours de la génération est conçue pour permettre de remplacer un hôte pendant la construction, sans toutefois conserver cette configuration dans l'image.

Les solutions mentionnées font référence au docker-compos que je proposais 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 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 de docker vous permet de spécifier toutes les options devant être utilisées lors du démarrage d’un conteneur. Les développeurs peuvent donc simplement docker composer pour démarrer le conteneur avec toutes les options qu’ils doivent définir.
108
VonC

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

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

La clé à noter ici est l’utilisation de la commande exec comme le suggère la documentation de docker. L'utilisation de exec transformera la commande Java en PID 1 pour le conteneur. . Les interruptions de Docker ne feront que répondre à cela.

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

19
Shubham Singh

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

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

Pour plus de détails sur l'utilisation de docker build avec le drapeau --add-Host, veuillez visiter: https://docs.docker.com/Edge/engine/reference/commandline/build/

15
Bill Cheng

Comme cela reste une première réponse dans Google, je proposerai une solution possible.

La commande prise 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"
9
Remy

Si cela est utile pour quiconque, la variable HOSTALIASES env a fonctionné pour moi:

echo "fakehost realhost" > /etc/Host.aliases
export HOSTALIASES=/etc/Host.aliases
4
user10805445

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

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

Ici, je mappe example.com à localhost 127.0.0.1 et à son fonctionnement.

2
Asad Shakeel

J'utilise AWS Elasticbeanstalk + Docker + Supervisord.

Réponse rapide

Ajoutez simplement du code dans Dockerfile.

CMD echo 123.123.123.123 this_is_my.Host >> /etc/hosts; supervisord -n;
1
Jay Lim
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
0
Name Last