From 6564d825f4e78d47b25c8d77a2dc374a781a8afc Mon Sep 17 00:00:00 2001 From: xugo Date: Thu, 26 Feb 2026 19:33:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=9B=B4=E5=A4=9A=E5=AE=B9?= =?UTF-8?q?=E5=99=A8=E8=BF=90=E8=A1=8C=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README_CN.md | 7 +++++++ internal/app/app.go | 39 +++++++++++++++++++++++++++++++++++---- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/README_CN.md b/README_CN.md index 832cae0..18edf1b 100644 --- a/README_CN.md +++ b/README_CN.md @@ -151,6 +151,13 @@ postgres 和 mysql 的格式即: 目前对 onnx 支持最友好 +> 播放黑屏,日志提示 zlm 连接不上? + +程序会自动识别是否容器中,才会主动启动 zlm,支持 docker/containerd/podman 等,如果确实没有拉起来,尝试在 compose 文件设置环境变量 NVR_STREAM=ZLM,重启容器试试。 + +播放黑屏也可能是 IP 配置有误,容器内 zlm 与 owl 联系用默认 127.0.0.1 即可,收流 IP 必须填写局域网 IP。 + + ## 文档 diff --git a/internal/app/app.go b/internal/app/app.go index 8ec3603..57f26db 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -9,6 +9,7 @@ import ( "os/signal" "path/filepath" "strconv" + "strings" "syscall" "time" @@ -98,11 +99,41 @@ func SetupLog(bc *conf.Bootstrap) (*slog.Logger, func()) { }) } +// isContainerEnv 兼容 Docker/containerd/Podman/Kubernetes 等多种容器运行时的检测 +func isContainerEnv() bool { + // Docker 运行时标志文件 + if _, err := os.Stat("/.dockerenv"); err == nil { + return true + } + // Podman 运行时标志文件 + if _, err := os.Stat("/run/.containerenv"); err == nil { + return true + } + // 通过 cgroup 信息检测 containerd / Kubernetes / Docker 等运行时 + if data, err := os.ReadFile("/proc/1/cgroup"); err == nil { + s := string(data) + for _, keyword := range []string{"docker", "kubepods", "containerd", "lxc", "podman"} { + if strings.Contains(s, keyword) { + return true + } + } + } + // cgroup v2 场景下 /proc/1/cgroup 可能只有 "0::/",需要额外检查 mountinfo + if data, err := os.ReadFile("/proc/self/mountinfo"); err == nil { + s := string(data) + for _, keyword := range []string{"/docker/", "/containerd/", "/kubepods/", "/podman/"} { + if strings.Contains(s, keyword) { + return true + } + } + } + return false +} + func setupZLM(ctx context.Context, dir string) { - // 检查是否在 Docker 环境中 - _, err := os.Stat("/.dockerenv") - if !(err == nil || os.Getenv("NVR_STREAM") == "ZLM") { - slog.Info("未在 Docker 环境中运行,跳过启动 zlm") + // 兼容多种容器运行时以及通过环境变量强制启用 + if !(isContainerEnv() || os.Getenv("NVR_STREAM") == "ZLM") { + slog.Info("未在容器环境中运行,跳过启动 zlm") return }