为何在Google Container Optimized OS上无法使用kubectl exec -it登录容器
问题根因
你遇到的126报错和Google Container Optimized OS节点无关,核心是目标容器使用了无基础系统组件的极简镜像构建(比如scratch、distroless系列镜像),这类镜像内部不存在/bin/bash、/bin/sh等shell程序,甚至连报错中提到的env基础可执行文件都没有,因此所有指定shell路径的exec操作都会失败。
解决方案
方案1:临时进入运行中的容器(无需重建镜像)
提前准备对应容器CPU架构的静态编译版busybox,通过kubectl cp命令拷贝到容器可写目录后执行:
- 拷贝二进制到容器
kubectl cp ./busybox <pod所在命名空间>/<pod名称>:/tmp/busybox - 执行进入容器
kubectl exec -it <pod名称> -- /tmp/busybox sh
注:使用的busybox必须为对应容器架构的静态编译版本,动态链接的二进制会因缺失依赖库无法运行
方案2:调整镜像构建逻辑(永久支持exec进入)
如果是自行维护的业务镜像,建议调整Dockerfile,在构建阶段将需要的shell和基础工具注入最终镜像,多阶段构建参考示例:
# 业务程序构建阶段 FROM golang:1.22 as builder WORKDIR /app COPY . . RUN CGO_ENABLED=0 go build -o my-service . # 基础工具提取阶段 FROM alpine:3.20 as tool-layer RUN apk add --no-cache bash busybox # 最终运行镜像 FROM gcr.io/distroless/static-debian12 # 拷贝业务程序 COPY --from=builder /app/my-service /my-service # 拷贝shell和基础工具 COPY --from=tool-layer /bin/bash /bin/bash COPY --from=tool-layer /bin/busybox /bin/busybox # 注册busybox内置命令 RUN ["/bin/busybox", "--install", "/bin"] ENTRYPOINT ["/my-service"]
重新构建镜像上线后,即可正常执行kubectl exec -it <pod名> -- bash/sh进入容器。
内容的提问来源于stack exchange,提问作者Sankar Prasanth Gadhamsetti
相关产品推荐
相关产品推荐

