wsir_x博客吧 关注:0贴子:4
  • 0回复贴,共1

当Docker镜像膨胀到8GB时,我的键盘差点学会了骂人

只看楼主收藏回复

场景一: "小而美"的理想 vs "胖成球"的现实
"不就是个Python脚本吗?怎么镜像比我家猫的毛球还大?"
某天当我试图部署一个Flask数据看板时:
Dockerfile
# 初代Dockerfile (反面教材)
FROM python:3.8
COPY . /app
RUN pip install -r requirements.txt
EXPOSE 5000
CMD [lbk]"python", "app.py"[rbk]
结果docker images显示 4.3GB!问题诊断:
用了完整的python镜像(带build-essential等)
没清理pip缓存(.cache目录占700MB)
把测试图片打包进了镜像(设计师的PSD文件在/app/assets里)
救赎方案:
Dockerfile
# 进化版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 [lbk]"gunicorn", "--bind", "0.0.0.0:5000", "app:app"[rbk]
镜像体积直降到 87MB,深藏功与名。
场景二:Spring Boot的"量子纠缠"式依赖
"我只是加了个redis客户端,为什么连宇宙射线监测库都被打包了?"
当Java项目的target/*.jar膨胀到300MB+时:
bash
# 查看Jar包成分
java -Djarmode=layertools -jar myapp.jar list
# 输出:dependencies,spring-boot-loader,application
瘦身秘籍:
Maven过滤非生产依赖:
xml
<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>
运行 HTML
分图层构建Docker镜像:
Dockerfile
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 [lbk]"java","-jar","/app.jar"[rbk]
从此jar包和IDE的卡顿说拜拜 👋
场景三:Go程序与Alpine的"爱恨情仇"
"明明本地跑得好好的,一进容器就segmentation fault?"
当用scratch镜像运行Go程序时:
Dockerfile
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 [lbk]"/myapp"[rbk]
结果报错:exec /myapp: no such file or directory
真相:动态链接库失踪!即使CGO_ENABLED=0也需要静态编译:
bash
go build -ldflags="-w -s -extldflags -static" -o myapp


IP属地:河南来自Android客户端1楼2025-03-24 08:30回复