镜像层优化与瘦身
镜像层数影响构建速度和镜像大小,下面介绍优化方法。
层数优化
合并 RUN 指令
dockerfile
# 错误:多层
FROM ubuntu:22.04
RUN apt-get update
RUN apt-get install -y nginx
RUN rm -rf /var/lib/apt/lists/*
# 正确:一层
FROM ubuntu:22.04
RUN apt-get update && \
apt-get install -y nginx && \
rm -rf /var/lib/apt/lists/*
每条 RUN 指令创建新层,合并减少层数。
Docker 1.10+ 层优化
dockerfile
# Docker 1.10+ 自动合并连续层
# 但合并指令仍然推荐,减少构建缓存失效
多阶段构建
编译与运行分离
dockerfile
# 编译阶段
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .
# 运行阶段
FROM alpine:3.18
COPY --from=builder /app/myapp .
CMD ["./myapp"]
效果:
- 编译镜像:~800MB
- 运行镜像:~10MB
Node.js 多阶段
dockerfile
FROM node:18 AS builder
WORKDIR /app
COPY . .
RUN npm run build
FROM node:18-alpine AS runner
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/server.js"]
基础镜像选择
| 基础镜像 | 大小 | 推荐场景 |
|---|---|---|
| ubuntu | ~77MB | 开发/调试 |
| debian-slim | ~30MB | 通用 |
| alpine | ~5MB | 生产 |
| distroless | ~20MB | 高安全 |
dockerfile
# 生产环境使用 Alpine
FROM alpine:3.18
RUN apk --no-cache add nginx
清理无用文件
dockerfile
# 安装后清理
RUN apt-get update && \
apt-get install -y --no-install-recommends \
nginx && \
rm -rf /var/lib/apt/lists/* && \
apt-get clean && \
rm -rf /tmp/* /var/tmp/*
--no-install-recommends不安装推荐包,rm -rf清理临时文件。
.dockerignore
Bash
node_modules/
.git/
*.md
test/
Dockerfile*
docker-compose*
减少构建上下文,加速构建。
镜像分析
text
# 查看镜像层
docker history my-app:latest
# 查看层大小
docker system df -v
# 使用 dive 分析
dive my-app:latest
要点总结
- 合并 RUN 指令减少层数,提升构建效率
- 多阶段构建分离编译和运行,显著减小体积
- 生产环境使用 Alpine 或 distroless 精简基础镜像
- 安装后清理包缓存和临时文件
- .dockerignore 排除无关文件,减小构建上下文
📝 发现内容有误?点击此处直接编辑