事情发生在一个风和日丽的周五下午。我打算把我写的\”下班倒计时服务\”部署到生产环境——它就干一件事:返回距离下班还有多少秒。简单、纯粹、毫无商业价值但每个打工人都需要。
kubectl apply 一气呵成,然后我盯着 Pod 状态等它变成 Running。
一分钟过去了。
两分钟过去了。
五分钟过去了,它还在 ContainerCreating。
我人麻了。一个返回数字的服务,启动比我周一早上起床还慢。
去节点上一查:docker images,好家伙,912MB。我的二进制文件本身才 7MB,剩下的 905MB 是什么?是 Go 编译器在里面度假吗?
案发现场:我的 Dockerfile
FROM golang:1.22
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o countdown .
EXPOSE 8080
CMD [\”./countdown\”]
看起来人畜无害对吧?每一行都写得规规矩矩。但问题就出在第一行——FROM golang:1.22。
这个镜像里有什么?完整的 Go 工具链(编译器、链接器、race detector)、一整个 Debian 系统(apt、bash、ls、cat、还有你这辈子都不会在容器里用的 500 个命令)、以及 Go module 下载缓存。
这些东西在编译的时候是你的战友,但在运行的时候,它们就是蹭吃蹭喝的房客——不交房租,还占你 900MB 硬盘。
更离谱的是,我的源码也被 COPY . . 整个拷进去了。也就

