name: docker-optimizer description: 审查Dockerfile的最佳实践、安全问题和镜像大小优化,包括多阶段构建和层缓存。适用于处理Docker、容器或部署时使用。 allowed-tools: Read, Grep, Glob, Write, Edit
Docker优化器
分析和优化Dockerfile的性能、安全性和最佳实践。
何时使用
- 用户正在处理Docker或容器
- 需要优化Dockerfile
- 容器镜像过大
- 用户提及“Docker”、“容器”、“镜像大小”或“部署”
使用说明
1. 查找Dockerfile
搜索:Dockerfile、Dockerfile.*、*.dockerfile
2. 检查最佳实践
使用特定的基础镜像版本:
# 不好
FROM node:latest
# 好
FROM node:18-alpine
最小化层数:
# 不好
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y git
# 好
RUN apt-get update && \
apt-get install -y curl git && \
rm -rf /var/lib/apt/lists/*
按变更频率排序指令:
# 依赖项比代码变更少
COPY package*.json ./
RUN npm install
COPY . .
使用.dockerignore:
node_modules
.git
.env
*.md
3. 多阶段构建
减少最终镜像大小:
# 构建阶段
FROM node:18 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 生产阶段
FROM node:18-alpine
WORKDIR /app
COPY --from=build /app/dist ./dist
COPY --from=build /app/node_modules ./node_modules
CMD ["node", "dist/index.js"]
4. 安全问题
不要以root身份运行:
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
不要在镜像中存储密钥:
# 不好:硬编码密钥
ENV API_KEY=secret123
# 好:使用构建参数或运行时环境变量
ARG BUILD_ENV
ENV NODE_ENV=${BUILD_ENV}
扫描漏洞:
docker scan image:tag
trivy image image:tag
5. 大小优化
使用Alpine镜像:
node:18-alpine对比node:18(900MB → 170MB)python:3.11-alpine对比python:3.11(900MB → 50MB)
删除不必要的文件:
RUN npm install --production && \
npm cache clean --force
使用特定的COPY:
# 不好:复制所有内容
COPY . .
# 好:仅复制所需内容
COPY package*.json ./
COPY src ./src
6. 缓存策略
层缓存优化:
# 首先安装依赖项(如果package.json未更改则缓存)
COPY package*.json ./
RUN npm install
# 复制源代码(变更更频繁)
COPY . .
RUN npm run build
7. 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD node healthcheck.js
8. 生成优化的Dockerfile
提供改进版本,包含:
- 多阶段构建
- 合适的基础镜像
- 安全改进
- 层优化
- 构建缓存
- .dockerignore文件
9. 构建命令
高效构建:
# 使用BuildKit
DOCKER_BUILDKIT=1 docker build -t app:latest .
# 从注册表缓存构建
docker build --cache-from myregistry/app:latest -t app:latest .
10. Dockerfile检查清单
- [ ] 特定的基础镜像标签(非
latest) - [ ] 如果适用,使用多阶段构建
- [ ] 非root用户
- [ ] 最小化层数(合并RUN命令)
- [ ] 存在.dockerignore文件
- [ ] 镜像中无密钥
- [ ] 正确的层排序以利用缓存
- [ ] 使用Alpine或slim变体
- [ ] 在同一RUN层中清理
- [ ] 定义HEALTHCHECK
安全最佳实践
- 定期扫描镜像
- 使用官方基础镜像
- 保持基础镜像更新
- 最小化攻击面(减少包数量)
- 以非root用户身份运行
- 尽可能使用只读文件系统
支持文件
templates/Dockerfile.optimized:优化的多阶段Dockerfile示例templates/.dockerignore:常见的.dockerignore模式