如何自动向Docker容器的/etc/hosts添加主机条目?
解决方案
问题分析
- 脚本变量赋值错误:你的脚本未正确定义
HOST变量,仅在echo语句中输出赋值表达式,导致$HOST实际为空。 - Dockerfile的CMD冲突:Docker只会执行最后一条
CMD指令,因此你写的sh sctr.sh不会被执行,且脚本文件名存在拼写错误(应为script.sh)。 - 主机IP获取逻辑错误:
hostname -i获取的是容器自身IP,而非宿主机IP,这是核心问题。
修正后的实现
方法一:利用Docker内置host.docker.internal(推荐)
Docker 18.03+版本提供host.docker.internal域名,直接指向宿主机IP(Linux系统启动容器需添加--add-host host.docker.internal:host-gateway参数)。
修正后的脚本(script.sh)
#!/bin/bash # 解析宿主机IP HOST_IP=$(getent hosts host.docker.internal | awk '{print $1}') # 将主机IP写入/etc/hosts,可自定义映射域名 echo "$HOST_IP host.example.com" >> /etc/hosts # 输出验证信息 echo "已添加宿主机IP $HOST_IP 到/etc/hosts"
修正后的Dockerfile
FROM tomcat:9.0.65 # 创建脚本目录并复制文件 RUN mkdir /ipscript COPY script.sh /ipscript/ # 添加脚本执行权限 RUN chmod +x /ipscript/script.sh # 先执行脚本再启动Tomcat ENTRYPOINT ["/ipscript/script.sh"] CMD ["catalina.sh", "run"]
方法二:通过Docker网桥网关获取主机IP
默认Docker网桥的网关IP即为宿主机IP,可通过容器路由表获取:
调整后的脚本
#!/bin/bash # 从路由表提取网关IP(宿主机IP) HOST_IP=$(ip route | awk 'NR==1 {print $3}') echo "$HOST_IP host.example.com" >> /etc/hosts echo "已添加宿主机IP $HOST_IP 到/etc/hosts"
Dockerfile与方法一一致,启动时无需额外参数。
容器启动方式
- Linux系统(方法一):
docker run -d --add-host host.docker.internal:host-gateway your-tomcat-image - Windows/Mac系统(方法一):直接启动即可,
host.docker.internal默认生效。
验证
进入容器查看/etc/hosts确认结果:
docker exec -it <容器ID> cat /etc/hosts
内容的提问来源于stack exchange,提问作者Ex6linz
相关产品推荐
相关产品推荐

