exec 找不到命令
docker exec 报 executable file not found in $PATH,说明容器内找不到要执行的命令:镜像里没装、PATH 与预期不同,或命令依赖的环境变量只写在入口脚本里(exec 不经过入口脚本)。
基本信息
| 报错 | executable file not found in $PATH |
|---|---|
| 关键点 | exec 新起进程,不经过入口脚本 |
| 定位手段 | 用 sh 查看 PATH 与命令是否存在 |
| 适用平台 | 所有 Docker 平台 |
| 规避做法 | 依赖在构建期装进镜像 |
典型使用场景
- 进容器排障时发现常用命令不存在
- 确认 PATH 与预期不同导致命令找不到
- 识别命令只存在于入口脚本环境里的情况
- 决定是构建期补齐工具还是临时安装
- 核对精简镜像里实际包含哪些工具
定位方法
定位方法
docker exec web sh -c 'echo $PATH' # 容器内实际 PATH
docker exec web sh -c 'command -v curl || echo missing'
docker exec -u root web sh -c 'command -v curl' # 换用户再确认
docker inspect -f '{{json .Config.Env}}' web # 镜像固化的环境变量现象与处理
| 现象 | 原因 | 处理方向 |
|---|---|---|
| 命令不存在 | 镜像里确实没装 | 构建期补装 |
| PATH 里没有 | 命令存在但目录不在 PATH 中 | 用绝对路径或调整 PATH |
| 换用户后可用 | 不同用户 PATH 不同 | 明确执行用户 |
| 入口脚本里可用 | 环境变量只在入口脚本中 | 把变量固化到镜像 |
在镜像里安装命令应该在构建期完成,运行时临时安装只适合一次性排障。
宿主能执行不代表容器能执行,精简镜像里默认没有 curl、ps 这类工具。
PATH 若在入口脚本里导出,exec 拿不到,用镜像的环境变量固化更稳。
排障时先试 sh 再试目标命令,能快速区分是镜像缺工具还是 PATH 问题。
需要长期保留的工具写进镜像定义,避免每次排障都要临时安装,也便于版本可追溯。
另一种容易混淆的报错是 exec format error:那个说的是文件格式或架构不对,而这里说的是在 PATH 里找不到命令,两类问题的排查方向完全不同。
基础镜像换发行版后命令名与安装的包集合都会变,迁移镜像后原本可用的排查命令可能集体消失,核对前先列出目标镜像实际包含的工具。