327 words
2 minutes
Dockerfile 最佳实践

好的 Dockerfile 能让镜像体积减小 90%,构建速度提升 50%

基础镜像选择#

使用 Alpine 镜像#

# ❌ 基础镜像过大
FROM node:18
# ✅ 推荐使用 Alpine
FROM node:18-alpine

Alpine 镜像只有约 5MB vs 900MB+。

多阶段构建#

# 构建阶段
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
# 运行阶段
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/index.js"]
TIP

多阶段构建可以完全移除构建工具,只保留运行时依赖。

层缓存优化#

# ❌ 每次代码修改都会导致依赖重新安装
COPY . .
RUN npm install
# ✅ 先复制依赖文件,安装后再复制代码
COPY package*.json ./
RUN npm ci
COPY . .

减少镜像层数#

# ❌ 多个 RUN 指令创建多层
RUN apt-get update
RUN apt-get install -y git
RUN apt-get clean
# ✅ 合并为一个 RUN
RUN 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 GB120 MB90%
5 min2 min60%
高危漏洞无漏洞安全

常用命令#

Terminal window
# 查看镜像大小
docker images
# 分析镜像层
docker history myimage:latest
# 清理无用构建缓存
docker builder prune