这个问题似乎被问了很多次,但答案似乎过时了,或者根本行不通。
我在一个没有RTC ( raspberry pi)的Linux系统上。我的主机运行一个ntp守护进程(ntpd),当主机启动时,它会检查联机时间,前提是它有互联网,并设置系统时钟。
容器中的代码需要知道主机的系统时钟是否准确(自上次启动以来已经更新)。
在主机上,这是非常容易做到的--使用类似于ntpdate -q 127.0.0.1的东西。ntpdate通过udp连接到127.0.0.1:123,并与ntpd守护进程检查时钟是否准确(如果它自上次启动以来就已经更新)。这似乎更难在容器内完成。
如果我启动一个容器,并使用docker container inspect NAME查看容器的IP,它将显示如下:
"Gateway": "172.19.0.1",
"IPAddress": "172.19.0.6",如果我在容器中运行ntpdate -q 172.19.0.1,这是可行的。不幸的是,172.19.0.1不是主机的永久IP。当容器启动时,子网已经被占用,子网会改变,所以硬编码这个IP是个坏主意。我需要的是一个环境变量,它总是反映主机的适当IP。
Windows和MacOS版本的docker似乎在容器中设置了host.docker.internal主机名,但是Linux没有。有些人建议在主机的/etc/hosts文件中设置这个名称,但是您只是硬编码IP,这同样可以更改。
我使用一个docker-compose.yml文件运行我的停靠容器,显然,在新版本的docker上,您可以这样做:
extra_hosts:
- "host.docker.internal:host-gateway"我试过这个,这个很管用。说大也大吧。在我的容器中,host.docker.internal解析为172.17.0.1,这是主机上docker0接口的IP。虽然我可以在容器中使用host.docker.internal,但是使用ntpdate -q host.docker.internal或ntpdate -q 172.17.0.1并不有效。
是否有办法使host.docker.internal从容器内解析到主机的适当网关IP?在我的例子中,172.19.0.1。
注意:是的,我可以使用容器内的代码来检查容器的网关使用netstat或类似的东西,但是接下来我需要将代码复杂化,让它计算出NTP服务器(码头主机)的IP。我可能还可以将接口套接字传递到容器中,并尝试通过该接口获得对接主机的IP,但这似乎是超级hackey,也是不必要的安全问题。
发布于 2022-02-11 07:39:32
我找到的最佳解决方案是使用iproute2包中的iproute2命令,查找默认路由并使用网关地址。
ip route | awk '/default/ {print $3}'如果您希望它在环境变量中,您可以使用
export HOST_IP_ADDRESS=$(ip route | awk '/default/ {print $3}')https://stackoverflow.com/questions/71073713
复制相似问题