Docker 码头工人。将动态主机ip添加到容器上的环境变量

Docker 码头工人。将动态主机ip添加到容器上的环境变量,docker,dns,environment-variables,containers,host,Docker,Dns,Environment Variables,Containers,Host,我有一个非常特殊的场景。包含一些docker容器的虚拟机。其中一个容器需要知道主机ip。问题是,如果我在容器构建时传递主机ip,或者在docker run命令上使用-e,那么它在容器上保持“静态”(始终不变,此时的一个) 虚拟机可以位于笔记本电脑上,并且笔记本电脑正在从不同的网络移动,每次重新启动时,虚拟机主机ip可能不同 此特殊容器具有--restart=always,并且不会再次生成或“docker run”。。。只有一次。正如我所说的,每次重新启动时,我都需要主机的ip来在其入口点上的容器

我有一个非常特殊的场景。包含一些docker容器的虚拟机。其中一个容器需要知道主机ip。问题是,如果我在容器构建时传递主机ip,或者在docker run命令上使用
-e
,那么它在容器上保持“静态”(始终不变,此时的一个)

虚拟机可以位于笔记本电脑上,并且笔记本电脑正在从不同的网络移动,每次重新启动时,虚拟机主机ip可能不同

此特殊容器具有
--restart=always
,并且不会再次生成或“docker run”。。。只有一次。正如我所说的,每次重新启动时,我都需要主机的ip来在其入口点上的容器内配置服务,因为容器有一个绑定dns服务器,它必须加载一个区域,其中包含一些必须指向自身的dns条目(主机的ip)。如果可能的话,一个环境变量会很好。以下是我的数据:

  • “正常”发射
我的Dockerfile的结尾:

....
....
ENTRYPOINT ["/etc/bind/entrypoint.sh"]
CMD ["/usr/sbin/named", "-g", "-c", "/etc/bind/named.conf", "-u", "bind"]
CMD (export HOSTIP=$(ifconfig eth0 | grep netmask | awk '{print $2}'));/usr/sbin/named -g -c /etc/bind/named.conf -u bind
入口点文件(如果var可以具有正确的值,则正则表达式可以正常工作):

Docker运行命令:

docker run --name myContainer -d --restart=always -p 53:53 -p 53:53/udp myImage
  • 我尝试的是:
我想入口点是可以的,如果我能为它提供一个具有正确值的var,就不应该修改它

如果我将
-e
放在docker run命令上,则即使主机位于不同的网络上,它也始终使用相同的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,但未成功:

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

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

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

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


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

我终于解决了这个问题。谢谢@yamenk的回答,它给了我一个想法,向上投票

最后,我做了:

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

一切正常!如果我在另一个不同的网络上启动vm(主机),它将获得ip,容器可以在开始使用新ip之前重新配置自身。

我对它进行了升级,因为它给了我映射卷文件的想法。你的方法
/proc/net/tcp
对我不起作用,但你的想法很好。我会发布我的解决方案。谢谢。你能分享你发布的脚本吗?我用docker撰写你的想法如何实现同样的效果?