Docker镜像优化需遵循分层精简原则:每条指令只做一件事且不残留中间产物;合并安装与清理至单个RUN指令;采用多阶段构建分离编译与运行环境;精简构建上下文与基础镜像;定期清理悬空层。

关键在于让每条指令只做一件事,且不留下中间产物——Docker 每个 RUN、COPY 或 ADD 都会固化一层,而层一旦生成就无法被后续操作“删除”,只能靠合并动作来避免残留。
合并安装与清理到同一 RUN 指令
把包更新、安装、清理写在一行里,确保缓存文件不会单独成层:
- Debian/Ubuntu:
RUN apt-get update && apt-get install -y curl && apt-get clean && rm -rf /var/lib/apt/lists/* - Alpine:
RUN apk add --no-cache curl(自动跳过缓存下载) - Node.js:
RUN npm ci --only=production && npm cache clean --force
用多阶段构建剥离构建依赖
编译环境和运行环境完全分离,最终镜像只保留可执行文件和最小依赖:
创建并管理 Docker 沙箱虚拟机环境以安全执行代理。适用于运行不受信任代码、探索包或隔离代理工作负载。支持 Claude、Codex、Copilot、Gemini 和 Kiro 代理,并提供网络代理控制。
- Go 项目:第一阶段用
golang:1.21编译,第二阶段用alpine:latest或distroless/static,仅COPY --from=builder /app/myserver . - Java 项目:只复制
target/app.jar,不带src/、classes/或pom.xml - Python 项目:构建阶段装完整依赖,运行阶段用
python:3.10-slim并只复制venv/或打包后的 wheel
精简构建上下文与基础镜像
减少上传体积和初始层大小,从源头控制冗余:
- 在
.dockerignore中排除node_modules/、.git/、logs/、tmp/、*.log等非必要目录 - 优先选用
alpine(~6MB)、distroless(~20MB)或静态编译后用scratch(0MB)作为基础镜像 - 检查是否生效:运行
docker build --progress=plain . | grep "Sending build context",确认传输字节数明显下降
构建后清理本地悬空层
即使 Dockerfile 写得再干净,反复构建仍会积累未被引用的中间层:
- 启用 BuildKit 时:运行
docker builder prune - 传统构建模式:运行
docker system prune -f --filter "until=24h",加时间过滤更安全 - 定期执行可防止磁盘被
dangling layers占满








