ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

witr --container 查不到容器怎么排查?容器运行时 CLI 不在 PATH 时的处理方式

witr --container 查不到容器怎么排查?容器运行时 CLI 不在 PATH 时的处理方式 witr --container 查不到容器怎么排查容器运行时 CLI 不在 PATH 时的处理方式【免费下载链接】witrWhy is this running? Trace any process, port, container, or file back to what started it - CLI TUI.项目地址: https://gitcode.com/GitHub_Trending/wi/witr在一台确认有容器在运行的机器上执行witr --container redis把redis换成你的容器名却没有任何结果终端报no container found matching redis一类的错误退出码为 2。这就是本文要解决的排查任务。witr 是一个用于回答 “Why is this running?” 的 CLI TUI 工具--container-c标志可以在 Docker、Podman、nerdctl、K8s/crictl、Incus、LXC、LXD 和 FreeBSD jails 中按容器名、镜像、命令以及 compose project/service 标签查找容器。本文适用于所有支持平台Linux、macOS、Windows、FreeBSD前提是你已装好 witr 并能用witr --version验证安装方式见 README.md 第 2 节。先弄清 witr 查容器的前提运行时 CLI 必须在 PATH 中witr 并不是自己读取运行时内部状态而是直接调用运行时 CLI 去查询对 Docker 就是执行docker ps --no-trunc --format ...对 Podman、nerdctl 等也类似见 internal/proc/runtime_dockerlike.go。每一次运行时查询带有 3 秒超时runtimeQueryTimeout同样在该文件定义。因此 README.md 的 Feature Compatibility Matrix 对 “By Container” 这一行给出的明确前提是Requires the runtime CLI on PATH (docker/podman/nerdctl/crictl/incus/lxc/lxc-ls/jls).源码中的实现与这条说明一致每个运行时的Available()判断就是exec.LookPath(cli)能否成功例如 internal/proc/runtime_docker.go 中binAvailable(docker)--container只遍历 “every detected runtime”见 internal/proc/container_runtime.go 的ResolveContainer注释。也就是说PATH 中找不到哪个运行时的 CLIwitr 就完全不会查询那个运行时——对应容器自然查不到。这是 “容器明明在运行、witr 却查不到” 最直接的原因。第一步复现问题并确认退出码在同一个 shell 里复现问题并观察退出码witr --container redis echo $?witr 的退出码是文档化的README.md “Exit Codes” 一节可以用来快速定位问题类型退出码含义0正常找到目标无警告1找到目标但带有警告2未找到没有匹配的进程或服务3权限不足4输入无效或匹配歧义5内部错误退出码是2witr 报告了no container found matching 名字错误文案定义在 internal/app/app.go 的processContainerTarget中并经由classifyError映射为退出码 2。按下面的第二步继续排查。退出码是3属于权限问题跳到文末 “权限不足时” 的小节。退出码是4通常是不明确的匹配见下文 “匹配多个容器时”。第二步确认运行时 CLI 是否在 PATH 中在运行 witr 的同一个 shell 里检查对应运行时的 CLI 是否可见。下面以 Docker 为例其他运行时把docker换成podman、nerdctl、crictl、incus、lxc、lxc-ls、jlscommand -v docker这是普通 shell 命令不是 witr 的命令它检查的是 witr 的文档前提——运行时 CLI 能否被 PATH 找到。有输出一个可执行文件路径CLI 在 PATH 中witr 会查询该运行时。此时查不到通常说明查询值没有命中任何字段--container只匹配容器名、镜像、命令和 compose project/service 标签换一个实际值再试。无输出CLI 不在 PATH 中witr 不会查询该运行时查不到容器是预期行为。进入第三步处理。第三步CLI 不在 PATH 时的处理方式处理目标只有一个让运行时 CLI 出现在 witr 所在 shell 的 PATH 里。witr 的文档对 “如何安装某个运行时 CLI” 不做说明那属于 Docker/Podman 等运行时自身的安装步骤这里只覆盖 PATH 相关的情况CLI 已安装但当前 shell 的 PATH 里没有它例如刚把安装目录加入 PATH、或只在某个环境/虚拟环境里配置了。打开一个新的终端会话重新执行command -v docker确认能看到路径然后再运行 witr。witr 的 Windows 安装脚本在修改 PATH 后也提示 “You may need to restart PowerShell”见 README.md 安装脚本说明PATH 变更需要新会话生效这一点对运行时 CLI 同理。CLI 根本没安装。需要先按对应运行时的官方方式安装 CLIwitr 的文档不包含这部分内容。装好后按第 1 点确认 PATH 可见性。注意 witr 本身也要求在自己的 PATH 中比如go install安装后README 明确提示要确保$GOPATH/bin或$HOME/go/bin在 PATH 中。如果你是用临时路径运行 witr 二进制也要保证运行时 CLI 对同一 shell 可见。验证修复是否生效处理完 PATH 后用与第一步相同的命令重新验证witr --container redis echo $?成功时退出码为 0 或 1输出里包含该容器的信息运行时、容器名、镜像、状态等加--verbose还会带上挂载、网络和 compose 元数据README.md 的 “Container Based Query” 一节。需要机器可读结果时用--json。如果退出码仍是 2还有一条文档给出的交叉核对路径不带任何参数直接运行witr进入 TUI其 Containers 标签页会列出 “All running containers across Docker, Podman, nerdctl, K8s/crictl, Incus, LXC, LXD, and FreeBSD jails in one list”README.md 第 3 节。如果 TUI 里也看不到该容器说明对应运行时仍未被查询到回到第二步重新检查 PATH。匹配到多个容器时如果查询值太宽泛比如镜像名被多个容器使用witr 会列出编号的候选并提示Multiple matching containers found: [1] name (runtime) image: ..., status: ..., ports: ... Re-run with the exact container name to disambiguate: witr -c container-name --exact输出格式见 internal/app/app.go 的printContainerMultiMatch此时退出码为 4。按提示改用精确名称加--exact重跑即可。其他与本场景相关的已文档化现象权限不足退出码 3witr 需要读取系统信息Linux/FreeBSD 以及 macOS 上文档建议用sudo witr [your arguments]重试README.md “Permissions Note”。另外源码中说明在 sudo 下运行时rootless 运行时podman、nerdctl会降回原用户执行查询以便普通用户的容器仍然可见见 internal/proc/runtime_dockerlike.go 中rootlessBins与runtimeCommand的注释。容器找到了但进程不可见当运行时运行在独立命名空间如 Docker Desktop、WSL2 distro、macOS VM中时容器主进程在宿主机上不可见witr 会回退为展示运行时侧的元数据并附上说明 “The owning process is not visible in this environment. This is common when the runtime runs in a separate namespace (e.g., Docker Desktop, WSL2 distro, macOS VM).”见 internal/output/docker.go。这不是查不到容器不要误判为 PATH 问题。匹配字段有限再次强调--container只匹配容器名、镜像、命令、compose project/service 标签四类字段README.md “Flags Options”。用这四类之外的值去查即使运行时 CLI 在 PATH 中也不会命中。完整的标志参考含--container可重复、可与其他目标混用等见 man 页 docs/cli/witr.md。【免费下载链接】witrWhy is this running? Trace any process, port, container, or file back to what started it - CLI TUI.项目地址: https://gitcode.com/GitHub_Trending/wi/witr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表