如何通过Dockerfile为K8s Pod添加ping等常用运维命令
问题根因
原有Dockerfile存在几个核心问题导致目标命令不可用:
- ping拷贝逻辑完全无效:单独创建的alpine、scratch临时构建阶段没有被最终运行阶段引用,ping二进制根本没进入最终的ubi8镜像
- 跨发行版二进制不兼容:alpine使用musl libc,ubi8使用glibc,就算强行把alpine版ping拷到ubi8环境也无法正常运行
- 所需的openssl、uuidgen、jq、hostname、ip、free命令均未安装,ubi-minimal基础镜像默认不自带这些工具
- ENTRYPOINT配置错误:误将不存在的
./ping作为启动参数传入,会干扰manager主程序正常运行
修改后的Dockerfile
直接删除无用的alpine、scratch临时构建阶段,在ubi-minimal阶段通过自带的microdnf包管理器安装所有需要的工具,安装完成后清理缓存减小镜像体积,完整内容如下:
# Build the manager binary FROM golang:1.17 as builder WORKDIR /workspace # Copy the Go Modules manifests COPY go.mod go.mod COPY go.sum go.sum # 缓存依赖,避免源码变更时重复下载 RUN go mod download # Copy the go source COPY main.go main.go COPY api/ api/ COPY controllers/ controllers/ COPY opt/ opt/ RUN ls -altr /workspace RUN chmod 775 /workspace/opt # 编译二进制 RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -o manager main.go FROM registry.access.redhat.com/ubi8/ubi-minimal:latest WORKDIR / # 安装所有需要的系统工具,安装后清理包缓存 RUN microdnf install -y \ iputils \ openssl \ util-linux \ iproute \ jq \ && microdnf clean all # 拷贝编译好的业务二进制和资源文件 COPY --from=builder /workspace/manager . COPY --from=builder /workspace/opt ./opt # 配置OpenShift兼容权限 RUN chgrp 0 /manager \ && chmod g=u /manager RUN chgrp -R 0 /opt \ && chmod -R g=u /opt # 修正启动命令,移除无效的./ping参数 ENTRYPOINT ["/manager"]
工具对应说明
安装的包和目标命令对应关系如下:
iputils:提供ping命令openssl:提供openssl命令util-linux:提供uuidgen、hostname、free命令iproute:提供ip命令jq:提供jq命令
所有命令都会被安装到系统标准PATH目录下,进入Pod后直接输入命令名即可调用,不需要指定全路径。
内容的提问来源于stack exchange,提问作者Kanagalakshmi Murugesan
相关产品推荐
相关产品推荐

