327 words
2 minutes
Dockerfile 最佳实践
好的 Dockerfile 能让镜像体积减小 90%,构建速度提升 50%
基础镜像选择
使用 Alpine 镜像
# ❌ 基础镜像过大FROM node:18
# ✅ 推荐使用 AlpineFROM node:18-alpineAlpine 镜像只有约 5MB vs 900MB+。
多阶段构建
# 构建阶段FROM node:18-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm ci --only=productionCOPY . .RUN npm run build
# 运行阶段FROM node:18-alpineWORKDIR /appCOPY --from=builder /app/dist ./distCOPY --from=builder /app/node_modules ./node_modulesEXPOSE 3000CMD ["node", "dist/index.js"]TIP多阶段构建可以完全移除构建工具,只保留运行时依赖。
层缓存优化
# ❌ 每次代码修改都会导致依赖重新安装COPY . .RUN npm install
# ✅ 先复制依赖文件,安装后再复制代码COPY package*.json ./RUN npm ciCOPY . .减少镜像层数
# ❌ 多个 RUN 指令创建多层RUN apt-get updateRUN apt-get install -y gitRUN apt-get clean
# ✅ 合并为一个 RUNRUN apt-get update && \ apt-get install -y git && \ apt-get clean && \ rm -rf /var/lib/apt/lists/*安全最佳实践
# ✅ 创建非 root 用户RUN addgroup -g 1001 appgroup && \ adduser -u 1001 -G appgroup -s /bin/sh -D appuser
USER appuser效果对比
| 优化前 | 优化后 | 提升 |
|---|---|---|
| 1.2 GB | 120 MB | 90% |
| 5 min | 2 min | 60% |
| 高危漏洞 | 无漏洞 | 安全 |
常用命令
# 查看镜像大小docker images
# 分析镜像层docker history myimage:latest
# 清理无用构建缓存docker builder prune