【前端+docker】NMS 容器启动失败?可能只是缺少一个 `/etc/nms/nacos` 文件
NMS 容器服务启动失败 — 问题排查与解决总结
一句话总结:新版 NMS 强制要求
/etc/nms/nacos文件存在且内容不能带换行符。用printf "nacos:8848" > /etc/nms/nacos创建该文件后重启容器即可解决。
引言
升级 NMS(网络管理系统)Deb 包后,是否遇到过容器反复重启、uptime始终归零、外部访问直接Connection reset的情况?表面 Supervisor 显示RUNNING,实则进程在“无限崩溃重启”的死循环里打转——这背后往往是一个被忽略的配置文件在作祟。
本文还原一次完整的现场排查过程:从容器的“假活”表象开始,到定位隐藏的业务日志、解析致命错误,最终揪出配置文件缺失和换行符格式异常两个根因,并给出直接在宿主机上一键修复的操作步骤。文末附有常用排查命令速查表,方便后续遇到类似问题时快速比对。
跟着排查路径走一遍,下次再碰到容器“起不来”的情况,便能有章可循。
目录
- 问题现象
- 排查路径(按顺序)
- 第 1 步:确认服务是否真的在运行
- 第 2 步:找到真正的业务日志
- 第 3 步:分析日志中的致命错误(FLT)
- 第 4 步:对比正常运行的容器
- 第 5 步:检查 Deb 包内容
- 根本原因
- 原因 1:配置文件缺失
- 原因 2:配置文件格式错误(换行符)
- 解决步骤(一键修复)
- 常用排查命令速查表
- 经验教训
一、问题现象
| 现象 | 描述 |
|---|---|
| 外部访问 | http://宿主机IP:8680无法访问,返回Connection reset |
| 容器内测试 | curl http://127.0.0.1:8080返回Connection refused |
| 服务状态 | supervisorctl status显示restserver、neapp等服务反复重启,uptime永远是0:00:00 |
| 端口监听 | `ss -lntp |
二、排查路径(按顺序)
下面是本次排查的完整决策路径,从现象到根因一目了然:
第 1 步:确认服务是否真的在运行
supervisorctl status关键点:如果uptime一直是0:00:00且pid不断变化,说明进程在无限崩溃重启,不是真的在运行。
第 2 步:找到真正的业务日志
NMS 的日志不在Supervisor 默认路径,而是在:
/var/log/nms_neapp.log /var/log/nms_ncappSuper.log /var/log/nms_alarmapp.log /var/log/nms_restserver.log查找方法:
find/var/log-name"nms_*.log"-mmin-10第 3 步:分析日志中的致命错误(FLT)
tail-n20/var/log/nms_neapp.log第 4 步:对比正常运行的容器
# 查看正常容器的配置和环境变量dockerexecyork-nms-1env|grep-iE"nacos|db|redis"dockerexecyork-nms-1ls-la/etc/nms/第 5 步:检查 Deb 包内容(确认官方是否自带该文件)
dpkg-deb-c/root/nms_1.0.0.1_20260804.deb|grep-iE"nacos|/etc/nms"三、根本原因
原因 1:配置文件缺失
[FLT] open /etc/nms/nacos: no such file or directory- 新版 Deb 包(
20260804)强制要求/etc/nms/nacos文件存在,找不到就直接退出。 - 旧版 Deb 包(
20260724)有回退机制,找不到文件会读取环境变量NACOS=nacos:8848。 - 该文件本应由 Deb 包的安装脚本(
postinst)自动生成,但升级过程中丢失了。
原因 2:配置文件格式错误(换行符)
[FLT] strconv.ParseUint: parsing "8848\n": invalid syntax- 使用
echo "nacos:8848" > /etc/nms/nacos创建文件时,末尾会自动追加换行符\n。 - Go 程序的
ParseUint函数严格拒绝换行符,导致解析失败。
四、解决步骤(一键修复)
在宿主机上执行:
# 1. 创建配置文件(printf 不会追加换行符)dockerexeclcan-nms-1sh-c'printf "nacos:8848" > /etc/nms/nacos'# 2. 验证文件内容(必须紧挨着提示符,没有换行)dockerexeclcan-nms-1cat/etc/nms/nacos# 正确输出:nacos:8848root@...(内容和提示符之间无换行)# 3. 重启容器dockerrestart lcan-nms-1# 4. 等待 10 秒后验证sleep10dockerexeclcan-nms-1 supervisorctl status restserver neapp成功标志:uptime持续增加(如0:00:15),不再是0:00:00。
五、常用排查命令速查表
| 场景 | 命令 |
|---|---|
| 查看服务状态 | supervisorctl status |
| 查看业务日志 | tail -n 50 /var/log/nms_neapp.log |
| 查找所有 NMS 日志 | find /var/log -name "nms_*.log" |
| 查看系统日志 | grep "restserver" /var/log/syslog | tail -n 20 |
| 检查端口监听 | ss -lntp | grep 8080 |
| 容器内测试连通性 | curl -I http://nacos:8848/nacos/ |
| 查看环境变量 | docker exec 容器名 env | grep -i nacos |
| 查看 Deb 包内容 | dpkg-deb -c 包名.deb | grep 关键字 |
| 追踪程序系统调用 | strace -f -e trace=file -o /tmp/trace.log 程序名 |
| 对比正常容器配置 | docker exec 正常容器名 cat /etc/supervisor/conf.d/10-supernms.conf |
六、经验教训
uptime 0:00:00是假活:Supervisor 显示RUNNING不代表服务正常,必须看uptime是否持续增长。- 日志不在默认位置:NMS 的业务日志在
/var/log/nms_*.log,不在 Supervisor 的/var/log/supervisor/下。 - 版本差异要警惕:升级 Deb 包后,新版可能改变配置读取逻辑(从"可选"变为"强制"),旧容器能跑不代表新容器也能跑。
- 写配置文件用
printf:echo会追加换行符,Go 程序解析端口/数字时会报错。写纯配置文件一律用printf。 - 对比正常环境是最快路径:遇到起不来的服务,第一时间去正常运行的容器里对比配置、环境变量、文件目录。
一句话总结:新版 NMS 强制要求
/etc/nms/nacos文件存在且内容不能带换行符。用printf "nacos:8848" > /etc/nms/nacos创建该文件后重启容器即可解决。