我在用 Docker 部署一个 Node.js 服务,配置了健康检查,但容器状态一直是 unhealthy。试过改端口、加延时,还是不行。
这是我的 Dockerfile 里的健康检查指令:
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3
CMD curl -f http://localhost:3000/health || exit 1
本地 curl 这个接口是通的,但在容器里好像就是不生效,到底哪里出问题了?
首先确认下容器里的网络设置,看看 3000 端口是不是真的暴露了。你可以进容器里直接跑
netstat -tuln看看端口状态。还有就是 HEALTHCHECK 用的 localhost 可能有问题,建议换成 127.0.0.1 或者服务绑定的具体 IP 地址试试。
另外 Dockerfile 里的 --start-period=40s 这个时间有点长了,可以缩短到 10s 左右看看效果。我之前遇到过类似情况,服务其实早就启动好了,但因为 start-period 太长反而错过了第一次检查。
如果还不行的话,可以试试在容器里手动执行一次你的健康检查命令,看看具体报什么错。有时候会是权限问题或者 curl 没装全。要是真不行就换用 wget 或者其他方式来做健康检查。
改完记得重建镜像重新跑一遍。希望这些建议能帮上忙,祝你好运!
先确认下 curl 命令是不是真的存在。有时候基础镜像里没装 curl,你可以进容器里调试看看:
如果找不到 curl,那就得换个工具,比如用 wget 或者更简单的 nc。
再一个就是网络配置问题。虽然你说本地能通,但容器内部的网络环境可能不一样。建议把 HEALTHCHECK 换成这种形式试试:
要是还不行,那就要排查应用本身的问题了。有可能是服务启动后还需要一些时间初始化,可以考虑延长 start-period 参数。
说实话,调试这类问题最烦的就是要反复试错,慢慢来吧。