You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动向Docker容器的/etc/hosts添加主机条目?

解决方案

问题分析

  1. 脚本变量赋值错误:你的脚本未正确定义HOST变量,仅在echo语句中输出赋值表达式,导致$HOST实际为空。
  2. Dockerfile的CMD冲突:Docker只会执行最后一条CMD指令,因此你写的sh sctr.sh不会被执行,且脚本文件名存在拼写错误(应为script.sh)。
  3. 主机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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 23:15:51