【发布时间】:2017-08-26 00:03:26
【问题描述】:
我有一个非常特殊的场景。包含一些 docker 容器的虚拟机。其中一个容器需要知道主机 ip。问题是,如果我在容器构建上传递主机 ip 或在 docker run 命令上使用-e,它在容器上仍然是“静态的”(总是相同的,那一刻)。
该 vm 可以在笔记本电脑上,并且笔记本电脑正在从不同的网络移动,并且每次重新启动时 vm 主机 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"]
入口点文件(如果 var 可以具有正确的值,则正则表达式可以正常工作):
#!/bin/bash
sed -ri "s/IN A.*/IN A $HOSTIP/" /etc/bind/db.my.zone
exec "$@"
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,但未成功:
CMD (export HOSTIP=$(ifconfig eth0 | grep netmask | awk '{print $2}'));/usr/sbin/named -g -c /etc/bind/named.conf -u bind
有可能实现这样的目标吗?谢谢。
【问题讨论】:
标签: docker dns environment-variables containers host