泊坞窗。 将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自己。