# 文档目录 Docker 部署方案 ## 问题描述 应用中 `/design` 路由通过 `fetch('/docs/...')` 加载项目根目录下 `docs/` 文件夹中的 Markdown 文档。在 Docker 容器中运行时,需要确保这些文档能够被访问。 ## 解决方案:Docker 卷挂载 采用 Docker 卷挂载方式,将宿主机的 `docs/` 目录直接映射到容器内,实现文档的实时更新和灵活管理。 ### 配置方式 #### docker-compose.yml 配置 ```yaml version: '3.8' services: nex-design: build: context: . dockerfile: Dockerfile volumes: - ./logs:/app/logs # 日志目录挂载 - ./docs:/app/dist/docs:ro # 文档目录挂载(只读) ``` **说明:** - `./docs:/app/dist/docs` - 将宿主机当前目录的 `docs` 映射到容器的 `/app/dist/docs` - `:ro` - 只读挂载,提高安全性,防止容器内进程修改文档 ### 方案优势 ✅ **实时更新** - 修改 MD 文件后立即生效 - 无需重新构建 Docker 镜像 - 无需重启容器 ✅ **方便维护** - 在宿主机直接编辑文档 - 使用熟悉的编辑器和工具 - 支持版本控制 ✅ **轻量镜像** - Docker 镜像不包含文档内容 - 镜像体积更小 - 构建速度更快 ✅ **灵活部署** - 可以独立管理文档版本 - 支持多环境部署(开发、测试、生产使用不同文档) - 易于更新和回滚 ### 目录结构 **宿主机:** ``` nex-design/ ├── docs/ # 文档源文件(Git 管理) │ ├── DESIGN_COOKBOOK.md │ ├── components/ │ │ ├── PageTitleBar.md │ │ ├── ListTable.md │ │ └── ... │ └── pages/ ├── dist/ # 构建产物(容器内) │ ├── index.html │ └── assets/ └── docker-compose.yml ``` **容器内:** ``` /app/ ├── dist/ # 应用构建产物 │ ├── index.html │ ├── assets/ │ └── docs/ # 挂载点 → 宿主机 docs/ ├── logs/ # 日志目录(挂载) └── ecosystem.config.js # PM2 配置 ``` ### 使用流程 #### 1. 启动服务 ```bash # 第一次启动(构建镜像) docker-compose up -d --build # 后续启动(使用已有镜像) docker-compose up -d ``` #### 2. 修改文档 ```bash # 在宿主机直接编辑文档 vim docs/DESIGN_COOKBOOK.md # 或使用 VS Code 等编辑器 code docs/components/PageTitleBar.md ``` #### 3. 验证更新 ```bash # 文档修改后立即生效,无需任何操作 # 浏览器刷新即可看到最新内容 # 或使用 curl 验证 curl http://localhost:3000/docs/DESIGN_COOKBOOK.md ``` ### 验证挂载 ```bash # 检查容器内的挂载情况 docker exec nex-design-app ls -la /app/dist/docs/ # 查看某个文档内容 docker exec nex-design-app cat /app/dist/docs/DESIGN_COOKBOOK.md # 验证文件同步 # 在宿主机修改文件 echo "# Test" >> docs/test.md # 立即在容器内查看 docker exec nex-design-app cat /app/dist/docs/test.md ``` ### 部署注意事项 #### 1. 生产环境部署 **方式一:携带 docs 目录** ```bash # 使用 git clone 或 scp 上传整个项目 git clone /path/to/deploy cd /path/to/deploy docker-compose up -d ``` **方式二:单独管理文档** ```bash # 文档单独部署在某个目录 mkdir -p /var/www/nex-design-docs # 上传文档到该目录 # 修改 docker-compose.yml volumes: - /var/www/nex-design-docs:/app/dist/docs:ro ``` #### 2. 权限管理 ```bash # 确保 docs 目录有正确的权限 chmod -R 755 docs/ # 只读挂载可防止容器内修改,但宿主机权限仍需控制 ``` #### 3. 多环境配置 可以为不同环境创建不同的 docker-compose 文件: ```bash # docker-compose.dev.yml - 开发环境 volumes: - ./docs:/app/dist/docs:ro # docker-compose.prod.yml - 生产环境 volumes: - /var/www/docs:/app/dist/docs:ro ``` 使用时指定配置文件: ```bash docker-compose -f docker-compose.prod.yml up -d ``` ### 故障排查 #### 问题 1:文档无法加载 ```bash # 检查挂载是否成功 docker inspect nex-design-app | grep -A 10 Mounts # 检查容器内文件 docker exec nex-design-app ls -la /app/dist/docs/ # 检查文件权限 ls -la docs/ ``` #### 问题 2:修改后未生效 ```bash # 确认使用的是卷挂载而不是 COPY docker exec nex-design-app cat /app/dist/docs/DESIGN_COOKBOOK.md # 检查浏览器缓存 # 使用 Ctrl+Shift+R 强制刷新 # 检查 serve 是否缓存了静态文件 docker-compose restart ``` #### 问题 3:Windows 路径问题 Windows 下需要注意路径格式: ```yaml # 错误 volumes: - .\docs:/app/dist/docs:ro # 正确 volumes: - ./docs:/app/dist/docs:ro ``` ### 性能考虑 #### 1. 卷挂载性能 - **Linux/macOS**: 性能很好,几乎无损耗 - **Windows/macOS + Docker Desktop**: 可能有轻微性能损耗 - **生产环境**: 使用 Linux 主机,性能最佳 #### 2. 优化建议 如果文档很多且访问频繁,可考虑: 1. **使用命名卷**: ```yaml volumes: docs-data: driver: local driver_opts: type: none o: bind device: /path/to/docs services: nex-design: volumes: - docs-data:/app/dist/docs:ro ``` 2. **缓存策略**: 在 Nginx 反向代理中添加缓存: ```nginx location /docs/ { proxy_pass http://nex_design; proxy_cache_valid 200 10m; add_header X-Cache-Status $upstream_cache_status; } ``` ## 替代方案对比 ### 方案 A: 构建时复制(未采用) ```dockerfile # Dockerfile COPY docs /app/dist/docs ``` ❌ 缺点: - 修改文档需要重新构建镜像 - 镜像体积更大 - 更新流程复杂 ✅ 优点: - 镜像自包含 - 适合不常修改的场景 ### 方案 B: prebuild 脚本(未采用) ```json { "scripts": { "prebuild": "cp -r docs public/" } } ``` ❌ 缺点: - 需要重新构建才能更新 - 增加构建时间 - 文档和代码耦合 ### 方案 C: 卷挂载(✅ 当前采用) ```yaml volumes: - ./docs:/app/dist/docs:ro ``` ✅ 优点: - 实时更新 - 灵活管理 - 镜像轻量 ⚠️ 注意: - 需要保持 docs 目录结构 - 部署时需要文档文件 ## 最佳实践 ### 1. 文档版本管理 ```bash # 使用 Git 管理文档版本 cd docs git log DESIGN_COOKBOOK.md # 回滚到特定版本 git checkout DESIGN_COOKBOOK.md ``` ### 2. 文档自动化部署 ```bash #!/bin/bash # scripts/update-docs.sh echo "更新文档..." cd /path/to/nex-design # 拉取最新文档 git pull origin main -- docs/ # 无需重启容器,文档即时生效 echo "文档已更新!" ``` ### 3. 监控文档访问 可以在 Nginx 中记录文档访问日志: ```nginx location /docs/ { access_log /var/log/nginx/docs-access.log; proxy_pass http://nex_design; } ``` ## 总结 使用 Docker 卷挂载方案是最灵活、最适合本项目的解决方案: ✅ **实时更新** - 修改即生效 ✅ **简单维护** - 直接编辑文件 ✅ **轻量镜像** - 更快的构建和部署 ✅ **灵活部署** - 支持多种场景 **核心配置只需一行:** ```yaml volumes: - ./docs:/app/dist/docs:ro ``` ## 相关文件 - `docker-compose.yml:16` - 卷挂载配置 - `DEPLOYMENT.md:14-35` - 部署文档说明 - `QUICKSTART.md` - 快速参考