2017-08-26 5 views
2

J'ai un scénario très spécial. Une machine virtuelle contenant des conteneurs docker. Un de ces conteneurs doit connaître l'adresse IP de l'hôte. Le problème est que si je passe l'IP de l'hôte sur la construction du conteneur ou en utilisant la commande -e sur docker, elle reste "statique" (toujours la même, celle de ce moment) sur le conteneur. Ce vm peut être sur un ordinateur portable et l'ordinateur portable se déplace à partir de différents réseaux et l'ip de l'hôte vm peut être différent à chaque redémarrage.Docker. Ajouter l'hôte dynamique à env var sur le conteneur

Ce conteneur spécial a le --restart=always et n'est pas construit ou "docker run" à nouveau ... une seule fois. Et comme je l'ai dit, j'ai besoin de l'IP de l'hôte à chaque redémarrage pour configurer le service dans le conteneur sur son entrypoint car le conteneur a un serveur bind dns qui doit charger une zone avec des entrées DNS qui doivent pointer sur lui-même). Un environnement var serait génial si possible. Ce sont mes données:

  • Le "normal" Lauch

La fin de mon Dockerfile:

.... 
.... 
ENTRYPOINT ["/etc/bind/entrypoint.sh"] 
CMD ["/usr/sbin/named", "-g", "-c", "/etc/bind/named.conf", "-u", "bind"] 

fichier Entrypoint (l'expression régulière fonctionne très bien si le var pourrait avoir la bonne valeur):

#!/bin/bash 
sed -ri "s/IN A.*/IN A $HOSTIP/" /etc/bind/db.my.zone 
exec "[email protected]" 

Docker run cmd:

docker run --name myContainer -d --restart=always -p 53:53 -p 53:53/udp myImage 
  • Ce que j'essayé:

Je suppose que le point d'entrée est correct et ne devrait pas être modifié si je peux fournir un var à la juste valeur.

Si je mets un -e sur ordre de marche docker, il est « hardcoded » pour toujours avec la même adresse IP toujours même si l'hôte est sur différents réseaux:

docker run -e HOSTIP=$(ifconfig eth0 | grep netmask | awk '{print $2}') --name myContainer \ 
-d --restart=always -p 53:53 -p 53:53/udp myImage 

J'ai essayé de modifier sans succès aussi le CMD sur Dockerfile :

CMD (export HOSTIP=$(ifconfig eth0 | grep netmask | awk '{print $2}'));/usr/sbin/named -g -c /etc/bind/named.conf -u bind 

Est-il possible de réaliser quelque chose comme ça? Merci.

Répondre

0

J'ai finalement résolu le problème. Merci @yamenk pour votre réponse, ça m'a donné l'idée, upvoting.

Enfin ce que je faisais:

  • J'ai créé un script simple sur l'hôte qui devient ip hôte et dans un autre ecriture fichier.
  • Je définis ce script à lancer sur chaque démarrage de l'hôte avant le démarrage du docker.
  • J'ai mappé le fichier avec l'ip dans le conteneur en utilisant la commande -v sur docker run.
  • Je tournai ma entrypoint pour obtenir l'adresse IP de ce fichier contenant l'IP et la modification des fichiers de configuration sed le conteneur nécessaire

Tout fonctionne! Si je démarre le VM (la machine hôte) sur un autre réseau différent, il obtient l'IP et le conteneur est capable de se reconfigurer avant de commencer avec la nouvelle IP.

2

Il existe le fichier /proc/net/tcp sur la machine hôte qui affiche toutes les sockets ouvertes. En particulier, la deuxième colonne est l'adresse locale de l'interface hôte.

Les valeurs de cette colonne sont stockées sous la forme de nombres hexadécimaux à quatre octets de petit-bout. Pour les convertir en adresses IP jetez un oeil here

Ainsi, lorsque vous démarrez votre conteneur, vous pouvez monter ce fichier depuis l'hôte sur le conteneur -v /proc/net/tcp:/host-tcp et lire les adresses IP de l'hôte qui seront constamment reflétées dans ce fichier.

+0

Je l'ai mis à jour parce qu'il m'a donné l'idée, en mappant un fichier de volume. Votre méthode '/ proc/net/tcp' n'a pas fonctionné pour moi, mais votre idée est bonne. Je posterai ma solution. Je vous remercie. – OscarAkaElvis