退出码 126 的含义
退出码 126 表示容器内目标命令存在但无法执行:没有执行权限、格式不对(缺 shebang,或二进制与架构不符),或者挂载进来的脚本权限位丢失。与 127 的区别是命令确实找到了,只是不能执行。
基本信息
| 含义 | 命令无法被调用 |
|---|---|
| 典型场景 | 入口脚本没有执行权限、复制时权限位丢失 |
| 验证手段 | 用 ls -l 看权限位,用 file 看文件格式 |
| 与 127 的区别 | 127 是找不到,126 是找到了但不能执行 |
| 常见环境 | 从 Windows 挂载脚本进来时最容易出现 |
典型使用场景
- 入口脚本挂载进容器后没有执行权限
- 文件复制或打包过程中权限位丢失
- 二进制与架构不符时定位
- CI 构建出的脚本权限异常
- 排查为什么本地能跑、容器里不能跑
验证与修复
验证与修复
docker run --rm -v "$PWD/entry.sh:/entry.sh" alpine /entry.sh # 权限不足时报 126
docker run --rm alpine sh -c 'ls -l /entry.sh' # 核对权限位
docker run --rm --entrypoint sh alpine -c 'chmod +x /entry.sh && /entry.sh' # 临时验证
# 修复方式:本地补执行权限,或在镜像构建时显式赋权线索与处理方向
| 线索 | 原因 | 处理方向 |
|---|---|---|
| 权限位缺少执行 | 挂载或复制丢权限 | 补上执行权限 |
| 文件格式异常 | 缺少 shebang | 补 shebang |
| 架构不符 | 二进制与宿主平台不一致 | 改用匹配平台的制品 |
| 本地正常容器异常 | 宿主权限模型不同 | 在镜像内固定权限 |
绑定挂载会保留宿主的权限位,从 Windows 挂载的脚本常常缺少执行权限,排查时先看权限。
放进镜像的脚本要在构建阶段显式赋予执行权限,别依赖宿主文件当前的状态。
126 也可能是文件格式不对,配合格式检查与架构确认一起看,避免只改权限。
排查时可以直接在容器里手动赋权执行,快速判断是权限问题还是格式问题。
团队里把脚本执行权限写进构建步骤,比在宿主上逐个调整更稳定。
同一份脚本在宿主与容器里的权限表现可能不同,以容器内核对的结果为准。