当Docker镜像膨胀到8GB时,我的键盘差点学会了骂人 —— 那些年我们交过的"容器税"
场景一: "小而美"的理想 vs "胖成球"的现实
"不就是个Python脚本吗?怎么镜像比我家猫的毛球还大?"
某天当我试图部署一个Flask数据看板时:
# 初代Dockerfile (反面教材) FROM python:3.8 COPY . /app RUN pip install -r requirements.txt EXPOSE 5000 CMD ["python", "app.py"]
结果docker images显示 4.3GB!问题诊断:
-
用了完整的python镜像(带build-essential等)
-
没清理pip缓存(.cache目录占700MB)
-
把测试图片打包进了镜像(设计师的PSD文件在/app/assets里)
救赎方案:
# 进化版Dockerfile FROM python:3.8-slim as builder COPY requirements.txt . RUN pip install --user --no-cache-dir -r requirements.txt FROM python:3.8-alpine COPY --from=builder /root/.local /root/.local COPY app.py . ENV PATH=/root/.local/bin:$PATH CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]
镜像体积直降到 87MB,深藏功与名。
场景二:Spring Boot的"量子纠缠"式依赖
"我只是加了个redis客户端,为什么连宇宙射线监测库都被打包了?"
当Java项目的target/*.jar膨胀到300MB+时:
# 查看Jar包成分
java -Djarmode=layertools -jar myapp.jar list
# 输出:dependencies,spring-boot-loader,application
瘦身秘籍:
-
Maven过滤非生产依赖:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layers>
<enabled>true</enabled>
</layers>
<excludes>
<exclude>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
-
分图层构建Docker镜像:
FROM eclipse-temurin:17-jdk as builder WORKDIR /app COPY . . RUN ./mvnw package -DskipTests FROM eclipse-temurin:17-jre COPY --from=builder /app/target/*.jar /app.jar ENTRYPOINT ["java","-jar","/app.jar"]
从此jar包和IDE的卡顿说拜拜 👋
场景三:Go程序与Alpine的"爱恨情仇"
"明明本地跑得好好的,一进容器就segmentation fault?"
当用scratch镜像运行Go程序时:
FROM golang:1.20 as build WORKDIR /app COPY . . RUN CGO_ENABLED=0 GOOS=linux go build -o /myapp FROM scratch COPY --from=build /myapp /myapp CMD ["/myapp"]
结果报错:exec /myapp: no such file or directory
真相:动态链接库失踪!即使CGO_ENABLED=0也需要静态编译:
go build -ldflags="-w -s -extldflags -static" -o myapp
或者改用alpine镜像(自带musl libc):
FROM alpine:3.18 RUN apk add --no-cache tzdata COPY myapp /myapp CMD ["/myapp"]
从此Go程序在容器里乖巧如猫 🐈
人类VS容器的哲学时刻
当我们:
-
把
docker system prune设为桌面快捷键 -
能默写
docker buildx的缓存参数 -
看到"最佳实践"就条件反射性检查COPY路径
或许这就是成长的代价?(笑)
终极觉悟:
容器化就像谈恋爱 —— 保持适度边界感,给彼此留够空间,关系才能健康持久 💑
下期预告:
《K8s治好了我的整理强迫症:当Node节点变成乐高积木》
本文来自博客园,作者:Wang、sir,转载请注明原文链接:https://www.cnblogs.com/wsir-x/p/18783263

浙公网安备 33010602011771号