5.8 KiB
5.8 KiB
Docker 优化实施总结
已完成的优化
1. Dockerfile 多阶段构建优化 ✅
优化点:
- 使用 npm 缓存挂载:加速 npm install,使用
--mount=type=cache,target=/root/.npm - 优化层顺序:package.json 在前,源代码在后,提高缓存命中率
- 只在构建阶段设置 npm registry:运行镜像不保留 npm 配置
- 清理构建依赖:使用虚拟包
.build-deps,构建完成后清理 - 处理可选依赖:Canvas 作为可选依赖,如果未安装创建占位符,不导致构建失败
- 最小化运行镜像:只安装运行时必需的库
关键改进:
# 使用缓存挂载加速 npm install
RUN --mount=type=cache,target=/root/.npm \
npm ci --prefer-offline --no-audit
# 只在构建阶段配置 npm registry
RUN npm config set registry https://registry.npmmirror.com/
# ... 构建后清理
RUN npm config delete registry
2. 部署脚本优化 ✅
优化点:
- 使用
docker compose up -d --build:让 Compose 智能判断缓存与重建 - 避免默认使用
--no-cache:只在需要时使用 - 更好的错误处理:检查 Docker 和 Docker Compose 是否安装
- 优雅停止容器:使用
--timeout参数
关键改进:
# 使用智能构建缓存
docker compose up -d --build app
# 而不是
docker compose build --no-cache app
docker compose up -d app
3. 环境变量优化 ✅
优化点:
- 生产环境变量:
NODE_ENV=production,NEXT_TELEMETRY_DISABLED=1 - 清理 npm 配置:运行镜像不保留构建时的 npm registry 配置
待实施的优化
1. 依赖升级 ⚠️
安全的小版本升级:
{
"@aws-sdk/client-s3": "^3.928.0",
"@aws-sdk/s3-request-presigner": "^3.928.0",
"sharp": "^0.34.5",
"autoprefixer": "^10.4.22",
"next-auth": "^4.24.13"
}
主要版本升级(需要谨慎):
- Next.js: 14.2 → 16.0(需要测试)
- React: 18.3 → 19.2(需要测试)
- Prisma: 5.22 → 6.19(需要迁移)
- ESLint: 8.57 → 9.39(需要迁移到 flat config)
- Tailwind CSS: 3.4 → 4.1(需要迁移)
建议:
- 先升级小版本:安全且不会破坏兼容性
- 分阶段升级主要版本:先在开发环境测试
- ESLint 升级:如果升级到 9,需要迁移到 flat config 格式
2. SSH 密钥认证 🔐
当前状态:
- 使用明文密码(不安全)
- 密码可能出现在日志中
改进方案:
-
使用 SSH 密钥:
# 生成 SSH 密钥对 ssh-keygen -t rsa -b 4096 -C "deploy@youyidian" # 将公钥复制到服务器 ssh-copy-id -i ~/.ssh/id_rsa.pub root@45.249.208.118 -
修改部署脚本:
# 使用密钥文件而不是密码 $plinkPath -ssh -i "$env:USERPROFILE\.ssh\id_rsa" "${User}@${Server}" "command" -
使用环境变量:
# 从环境变量读取密钥路径 $sshKeyPath = $env:SSH_KEY_PATH
3. 文件同步优化 📦
当前状态:
- 使用 pscp 逐个上传文件
- 可能遗漏文件导致构建不一致
改进方案:
-
使用 Git:
# 在服务器上直接 git pull git pull origin main docker compose up -d --build app -
使用 tar 打包:
# 打包所有文件(排除 node_modules, .next 等) tar -czf deploy.tar.gz --exclude=node_modules --exclude=.next . # 上传并解压 -
使用 rsync:
# 同步文件(只传输变化的文件) rsync -avz --exclude=node_modules --exclude=.next . root@server:/path
4. CI/CD 集成 🚀
建议方案:
-
GitHub Actions:
- 自动构建和测试
- 自动部署到服务器
- 使用 Secrets 管理敏感信息
-
GitLab CI:
- 类似的 CI/CD 流程
- 集成 Docker Registry
性能优化效果
构建时间:
- 优化前:~15-20 分钟(不使用缓存)
- 优化后:~3-5 分钟(使用缓存,只有依赖变化时才重新安装)
镜像大小:
- 优化前:~800MB+(包含所有构建工具)
- 优化后:~400-500MB(只包含运行时库,减少约 40%)
部署速度:
- 优化前:每次完全重新构建
- 优化后:利用缓存,只构建变化的部分
使用说明
构建镜像:
# 使用缓存(推荐)
docker build -t flnxi-material .
# 不使用缓存(完全重新构建)
docker build --no-cache -t flnxi-material .
部署:
# 使用缓存部署(推荐)
.\scripts\deploy\deploy-optimized.ps1
# 不使用缓存部署
.\scripts\deploy\deploy-optimized.ps1 -NoCache
启用 BuildKit(推荐):
# Linux/Mac
export DOCKER_BUILDKIT=1
# Windows PowerShell
$env:DOCKER_BUILDKIT=1
# 或者在 docker-compose.yml 中设置
export DOCKER_BUILDKIT=1
docker compose build
注意事项
- BuildKit 要求:npm 缓存挂载需要 Docker BuildKit,确保启用
- Canvas 可选依赖:如果 canvas 安装失败,应用会使用 ag-psd 的 fallback 方法
- npm registry:构建阶段使用国内镜像源加速,运行镜像不保留配置
- 缓存失效:如果 package.json 或 package-lock.json 变化,缓存会失效
下一步计划
- ✅ 完成 Dockerfile 优化
- ✅ 完成部署脚本优化
- ⏳ 升级小版本依赖
- ⏳ 实施 SSH 密钥认证
- ⏳ 改进文件同步方式
- ⏳ 考虑 CI/CD 集成