2017-08-26 42 views
2

我有一个非常特殊的场景。包含一些码头集装箱的虚拟机。其中一个容器需要知道主机IP。问题是如果我通过容器构建主机ip或在Docker运行命令上使用-e,它在容器上保持“静态”(始终是相同的那一刻)。码头工人。将动态主机ip添加到容器上的env var

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

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

  • “正常”劳克

我Dockerfile的结束:

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

入口点文件(正则表达式工作正常,如果该变种可以有正确的价值):

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

泊坞运行CMD:

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

我猜的入口点是确定的,不应该被修改,如果我可以提供给它用正确的值VAR。

如果我把一个-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 

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

回答

0

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

最后我做了什么:

  • 我创建了主机这是越来越主机的IP,并书面方式到另一个文件中一个简单的脚本。
  • 我设置了脚本在Docker启动前在每个主机启动时启动。
  • 我使用docker run命令中的-v将带有ip的文件映射到容器中。
  • 设置我的入口点,以获得从该文件中包含的IP地址和使用sed所需容器的配置文件

一切工作修改IP!如果我在另一个不同的网络上启动虚拟机(主机),它会获得IP,并且在启动新的IP之前,容器可以重新配置自己。

2

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

此列中的值存储为little-endian四字节十六进制数字。把它们转换成IP地址看一看here

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

+0

我提高了它,因为它给了我想法,映射卷文件。你的方法'/ proc/net/tcp'不适合我,但你的想法很好。我会发布我的解决方案。谢谢。 – OscarAkaElvis

相关问题