码头工人。将动态主机ip添加到容器上的env var
我有一个非常特殊的场景。包含一些码头集装箱的虚拟机。其中一个容器需要知道主机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
可能实现这样的事情?谢谢。
我终于解决了。谢谢@yamenk你的回答,它给了我这个想法,upvoting。
最后我做了什么:
- 我创建了主机这是越来越主机的IP,并书面方式到另一个文件中一个简单的脚本。
- 我设置了脚本在Docker启动前在每个主机启动时启动。
- 我使用docker run命令中的
-v
将带有ip的文件映射到容器中。 - 设置我的入口点,以获得从该文件中包含的IP地址和使用sed所需容器的配置文件
一切工作修改IP!如果我在另一个不同的网络上启动虚拟机(主机),它会获得IP,并且在启动新的IP之前,容器可以重新配置自己。
在主机上有文件/proc/net/tcp
显示所有打开的套接字。特别是,第二列是主机接口的local_address。
此列中的值存储为little-endian四字节十六进制数字。把它们转换成IP地址看一看here
因此,当你启动你的容器时,你可以从主机上挂载这个文件到容器-v /proc/net/tcp:/host-tcp
上,并读取这个文件中不断反映的主机IP地址。
我提高了它,因为它给了我想法,映射卷文件。你的方法'/ proc/net/tcp'不适合我,但你的想法很好。我会发布我的解决方案。谢谢。 – OscarAkaElvis