泊坞窗。 将dynamic主机ip添加到容器的env var

我有一个非常特殊的场景。 包含一些docker容器的虚拟机。 其中一个容器需要知道主机IP。 问题是,如果我通过容器上的主机IP或在Docker运行命令使用-e ,它仍然是“静态”(始终是相同的,那一刻)在容器上。

该虚拟机可以在笔记本电脑上,而笔记本电脑正在从不同的networking移动,每次重新启动虚拟主机IP可以是不同的。

这个特殊的容器有--restart=always ,并且没有被构build或者再次运行“ --restart=always run”。 正如我所说的,我需要在每次重新启动主机的ip来configuration容器内的服务在它的入口点,因为容器有一个绑定DNS服务器,必须加载一个区域必须指向自己的一些DNS条目(主机的IP )。 如果可能的话,环境variables将会很好。 这些是我的数据:

  • 这个“正常”的

我的Dockerfile的结尾:

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

入口点文件(正则expression式工作正常,如果var可以有正确的值):

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

Docker运行cmd:

 docker run --name myContainer -d --restart=always -p 53:53 -p 53:53/udp myImage 
  • 我试过的:

我想入口点是好的,不应该被修改,如果我可以提供给它一个正确的值的variables。

如果我在Docker运行命令中加上-e ,即使主机位于不同的networking上,它也会始终以相同的ip永远“硬编码”:

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

我也尝试修改Dockerfile上的CMD失败:

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

有可能实现这样的事情? 谢谢。

主机上有/proc/net/tcp文件,显示所有打开的套接字。 特别是,第二列是主机接口的local_address。

此列中的值以小尾数的四字节hex数字forms存储。 要将这些转换为IP地址,请看这里

因此,当你启动你的容器时,你可以从主机上挂载这个文件到容器-v /proc/net/tcp:/host-tcp并读取这个文件中不断反映的主机IP地址。

我终于解决了。 谢谢@yamenk你的答案,它给了我想法,upvoting。

最后我做了什么:

  • 我在主机上创build了一个简单的脚本,获取主机ip并将其写入另一个文件。
  • 我设置脚本在Docker启动之前在每个主机启动时启动。
  • 我使用docker run命令中的-v将该文件与ip映射到容器中。
  • 我设置我的入口点从该文件包含IP和修改所需的容器configuration文件的sed

一切正常! 如果我在另一个不同的networking上启动虚拟机(主机),它会得到IP,并且在启动新的IP之前,容器能够重新configuration自己。