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

时间:2017-08-26 00:03:27

标签: docker dns environment-variables containers host

我有一个非常特别的场景。包含一些docker容器的虚拟机。其中一个容器需要知道主机ip。问题是如果我在容器构建上传递主机ip或在docker run命令上使用-e,它仍然是"静态"容器上的(总是相同的,那一刻)。

vm可以放在笔记本电脑上,笔记本电脑正在从不同的网络移动,每次重启时vm主机ip都可以不同。

此特殊容器具有--restart=always并且未构建或" docker run"再次......只有一次。正如我所说,我需要每次重启时主机的ip配置容器内的服务在它的入口点,因为容器有一个绑定DNS服务器,必须加载带有一些必须的dns条目的区域指向自己(主持人的IP)。如果可能的话,环境var会很好。这些是我的数据:

  • " normal"劳克

我的Dockerfile的结尾:

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

入口点文件(如果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
  • 我尝试了什么:

我认为入口点没问题,如果我可以为其提供具有正确值的var,则不应该修改。

如果我在docker run命令上放置一个-e,那就是"硬编码"永远使用相同的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

有可能实现这样的目标吗?感谢。

2 个答案:

答案 0 :(得分:2)

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

此列中的值存储为little-endian四字节十六进制数字。要将这些转换为IP地址,请查看here

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

答案 1 :(得分:0)

我终于解决了它。谢谢你@yamenk的回答,它给了我这个想法,支持我。

最后我做了什么:

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

一切正常!如果我在另一个不同的网络上启动vm(主机),它会获得ip,并且容器能够在启动新ip之前重新配置自己。