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

Docker. Add dynamic host ip to env var on container

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

虚拟机可以在笔记本电脑上,笔记本电脑从不同的网络移动,每次重新启动时虚拟机主机 IP 可能不同。

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

我的 Docker 文件结束:

....
....
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,则不应修改它。

如果我在 docker 运行 命令上放置 -e,即使主机在不同的网络上,它也是 "hardcoded" 永远具有相同的 IP:

docker run -e HOSTIP=$(ifconfig eth0 | grep netmask | awk '{print }') --name myContainer \
-d --restart=always -p 53:53 -p 53:53/udp myImage

我也尝试修改 Docker 文件上的 CMD,但未成功:

CMD (export HOSTIP=$(ifconfig eth0 | grep netmask | awk '{print }'));/usr/sbin/named -g -c /etc/bind/named.conf -u bind

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

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

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

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

我终于解决了。谢谢@yamenk 的回答,给了我灵感,赞。

最后我做了什么:

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

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