config挂载
This commit is contained in:
@@ -6,8 +6,10 @@ FROM mysql:8.0
|
||||
ENV LANG=C.UTF-8 \
|
||||
TZ=Asia/Shanghai
|
||||
|
||||
# 复制MySQL配置文件
|
||||
COPY docker/mysql/my.cnf /etc/mysql/conf.d/my.cnf
|
||||
# 注意:MySQL配置有两种方式
|
||||
# 1. 通过docker-compose.yml的command参数(基础配置)
|
||||
# 2. 通过挂载my.cnf文件(高级配置,可选)
|
||||
# docker-compose.yml中可以取消注释: ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
|
||||
|
||||
# 创建SQL目录
|
||||
RUN mkdir -p /docker-entrypoint-initdb.d /opt/sql
|
||||
@@ -61,7 +63,7 @@ source reInit.sh
|
||||
# 调用reInit.sh的核心函数(跳过备份和删除)
|
||||
execute_init_script # 执行initAll.sql
|
||||
import_sensitive_words # 导入敏感词
|
||||
|
||||
|
||||
# Docker环境特定配置:更新爬虫路径
|
||||
echo "更新Docker环境配置..."
|
||||
mysql -uroot "${MYSQL_DATABASE}" <<EOSQL
|
||||
|
||||
@@ -1,516 +0,0 @@
|
||||
# Docker构建流程检查报告
|
||||
|
||||
## 📋 检查项目清单
|
||||
|
||||
### ✅ 1. build.sh 构建流程
|
||||
|
||||
#### 1.1 Git更新代码
|
||||
```bash
|
||||
# 第59-81行
|
||||
log_step "步骤1: 拉取最新代码"
|
||||
git pull origin main || git pull origin master
|
||||
```
|
||||
**状态**: ✅ 已实现
|
||||
- 检查未提交更改
|
||||
- 支持main/master分支
|
||||
- 错误处理
|
||||
|
||||
#### 1.2 编译后端
|
||||
```bash
|
||||
# 第84-111行
|
||||
cd "${SERV_PATH}"
|
||||
mvn clean
|
||||
mvn package -DskipTests -pl admin -am
|
||||
```
|
||||
**状态**: ✅ 已实现
|
||||
- 清理旧构建
|
||||
- 编译admin模块
|
||||
- 验证jar包存在
|
||||
- 显示文件大小
|
||||
|
||||
**产物**: `schoolNewsServ/admin/target/admin-1.0.0.jar`
|
||||
|
||||
#### 1.3 构建前端
|
||||
```bash
|
||||
# 第113-148行
|
||||
cd "${WEB_PATH}"
|
||||
npm install # 如果需要
|
||||
rm -rf dist
|
||||
npm run build
|
||||
```
|
||||
**状态**: ✅ 已实现
|
||||
- 检查依赖
|
||||
- 清理旧构建
|
||||
- 构建dist目录
|
||||
- 验证文件数量
|
||||
|
||||
**产物**: `schoolNewsWeb/dist/`
|
||||
|
||||
---
|
||||
|
||||
## 🐳 2. Docker镜像构建
|
||||
|
||||
### 2.1 镜像版本命名
|
||||
|
||||
```bash
|
||||
# 第45行
|
||||
IMAGE_VERSION=$(date +%Y%m%d_%H%M%S)
|
||||
```
|
||||
|
||||
**格式**: `yyyymmdd_HHMMSS`
|
||||
**示例**: `20251124_143025`
|
||||
**状态**: ✅ 符合要求
|
||||
|
||||
### 2.2 后端镜像(school-news-serv)
|
||||
|
||||
**Dockerfile.serv 检查**:
|
||||
|
||||
```dockerfile
|
||||
FROM eclipse-temurin:21-jre
|
||||
|
||||
# ✅ 包含jar包
|
||||
COPY schoolNewsServ/admin/target/admin-1.0.0.jar /app/app.jar
|
||||
|
||||
# ✅ 包含爬虫
|
||||
COPY schoolNewsCrawler/ /app/crawler/
|
||||
|
||||
# ✅ 安装爬虫依赖
|
||||
RUN pip install -r /app/crawler/requirements.txt
|
||||
|
||||
# ✅ 配置文件模板(可挂载)
|
||||
COPY application.yml /app/config/application.yml.template
|
||||
COPY log4j2-spring.xml /app/config/log4j2-spring.xml.template
|
||||
|
||||
# ✅ 安装MySQL客户端(用于配置更新)
|
||||
RUN apt-get install -y default-mysql-client
|
||||
```
|
||||
|
||||
**挂载点**:
|
||||
- ✅ `/app/config/application.yml` - 配置文件
|
||||
- ✅ `/app/config/log4j2-spring.xml` - 日志配置
|
||||
- ✅ `/app/logs` - 日志目录
|
||||
- ✅ `/app/uploads` - 上传文件
|
||||
- ✅ `/app/crawler` - 爬虫脚本
|
||||
|
||||
**结论**: ✅ **完全符合要求**
|
||||
|
||||
---
|
||||
|
||||
### 2.3 前端镜像(school-news-web)
|
||||
|
||||
**Dockerfile.web 检查**:
|
||||
|
||||
```dockerfile
|
||||
FROM nginx:alpine
|
||||
|
||||
# ✅ 包含构建结果
|
||||
COPY schoolNewsWeb/dist/ /usr/share/nginx/html/schoolNewsWeb/
|
||||
|
||||
# ✅ 配置文件(可外挂)
|
||||
COPY schoolNewsWeb/public/app-config.js /app/config/app-config.js.template
|
||||
|
||||
# ✅ 启动时处理配置替换
|
||||
COPY schoolNewsWeb/docker/start.sh /app/start.sh
|
||||
```
|
||||
|
||||
**配置外挂机制**:
|
||||
```bash
|
||||
# start.sh
|
||||
if [ -f /app/config/app-config.js ]; then
|
||||
cp /app/config/app-config.js /usr/share/nginx/html/schoolNewsWeb/app-config.js
|
||||
fi
|
||||
```
|
||||
|
||||
**挂载点**:
|
||||
- ✅ `/app/config/app-config.js` - 运行时配置(可整个替换)
|
||||
- ✅ `/app/logs` - 日志目录
|
||||
|
||||
**配置加载流程**:
|
||||
```
|
||||
1. HTML引用 <script src="/schoolNewsWeb/app-config.js">
|
||||
2. 设置 window.APP_RUNTIME_CONFIG
|
||||
3. src/config/index.ts 读取 window.APP_RUNTIME_CONFIG
|
||||
4. 应用使用配置
|
||||
```
|
||||
|
||||
**结论**: ✅ **完全符合要求** - 可外挂配置
|
||||
|
||||
---
|
||||
|
||||
### 2.4 MySQL镜像(school-news-mysql)
|
||||
|
||||
**Dockerfile.mysql 检查**:
|
||||
|
||||
```dockerfile
|
||||
FROM mysql:8.0
|
||||
|
||||
# ✅ 包含所有SQL文件
|
||||
COPY schoolNewsServ/.bin/mysql/sql/ /opt/sql/
|
||||
|
||||
# ✅ 复用reInit.sh
|
||||
COPY schoolNewsServ/.bin/mysql/sql/reInit.sh /opt/sql/
|
||||
|
||||
# ✅ 创建初始化脚本
|
||||
RUN cat > /docker-entrypoint-initdb.d/01-init-database.sh <<'EOF'
|
||||
# Source reInit.sh
|
||||
source reInit.sh
|
||||
# 调用核心函数
|
||||
execute_init_script # 执行initAll.sql
|
||||
import_sensitive_words # 导入敏感词
|
||||
# UPDATE Docker特定配置
|
||||
UPDATE tb_sys_config SET config_value='/usr/bin/python3' WHERE config_key='crawler.pythonPath';
|
||||
EOF
|
||||
```
|
||||
|
||||
**初始化流程**:
|
||||
```
|
||||
容器启动
|
||||
↓
|
||||
执行 01-init-database.sh
|
||||
↓
|
||||
source reInit.sh(加载函数)
|
||||
↓
|
||||
execute_init_script()
|
||||
└─ mysql < initAll.sql
|
||||
├─ SOURCE createDB.sql
|
||||
├─ SOURCE createTableUser.sql
|
||||
├─ SOURCE createTableNews.sql
|
||||
├─ ... (13个createTable)
|
||||
├─ SOURCE initMenuData.sql
|
||||
└─ SOURCE initAllData.sql
|
||||
↓
|
||||
import_sensitive_words()
|
||||
└─ bash importSensitiveWords.sh -y
|
||||
└─ 导入1.2万个敏感词
|
||||
↓
|
||||
UPDATE Docker配置
|
||||
├─ crawler.pythonPath = /usr/bin/python3
|
||||
└─ crawler.basePath = /app/crawler
|
||||
↓
|
||||
完成 ✅
|
||||
```
|
||||
|
||||
**优势**:
|
||||
- ✅ 完全复用reInit.sh逻辑
|
||||
- ✅ 自动同步(修改reInit.sh,Docker自动更新)
|
||||
- ✅ 环境变量可覆盖默认配置
|
||||
|
||||
**结论**: ✅ **完全符合要求** - 通过reInit.sh构建数据库
|
||||
|
||||
---
|
||||
|
||||
## 📦 3. 镜像导出
|
||||
|
||||
### 3.1 导出格式
|
||||
|
||||
**检查 build.sh 导出逻辑**:
|
||||
|
||||
```bash
|
||||
# 预期位置:第208-250行
|
||||
docker save -o "${BUILD_OUTPUT}/school-news-mysql_${IMAGE_VERSION}.tar" school-news-mysql:${IMAGE_VERSION}
|
||||
docker save -o "${BUILD_OUTPUT}/school-news-serv_${IMAGE_VERSION}.tar" school-news-serv:${IMAGE_VERSION}
|
||||
docker save -o "${BUILD_OUTPUT}/school-news-web_${IMAGE_VERSION}.tar" school-news-web:${IMAGE_VERSION}
|
||||
```
|
||||
|
||||
**导出文件**:
|
||||
- `school-news-mysql_20251124_143025.tar`
|
||||
- `school-news-serv_20251124_143025.tar`
|
||||
- `school-news-web_20251124_143025.tar`
|
||||
|
||||
**状态**: ⏳ 需要确认build.sh中是否实现
|
||||
|
||||
---
|
||||
|
||||
## 🔍 4. docker-compose.yml 检查
|
||||
|
||||
### 4.1 MySQL服务
|
||||
|
||||
```yaml
|
||||
mysql:
|
||||
image: school-news-mysql:latest
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-123456}
|
||||
MYSQL_DATABASE: ${MYSQL_DATABASE:-school_news}
|
||||
volumes:
|
||||
- mysql-data:/var/lib/mysql # ✅ 数据持久化
|
||||
healthcheck:
|
||||
test: mysqladmin ping # ✅ 健康检查
|
||||
```
|
||||
|
||||
**状态**: ✅ 已配置
|
||||
|
||||
### 4.2 后端服务
|
||||
|
||||
```yaml
|
||||
school-news-serv:
|
||||
image: school-news-serv:latest
|
||||
depends_on:
|
||||
mysql:
|
||||
condition: service_healthy # ✅ 等待MySQL就绪
|
||||
volumes:
|
||||
- ./config/application.yml:/app/config/application.yml # ✅ 配置挂载
|
||||
- ./config/log4j2-spring.xml:/app/config/log4j2-spring.xml # ✅ 日志配置
|
||||
- ./logs/serv:/app/logs # ✅ 日志目录
|
||||
- ./uploads:/app/uploads # ✅ 上传文件
|
||||
- ../schoolNewsCrawler:/app/crawler # ✅ 爬虫脚本
|
||||
```
|
||||
|
||||
**状态**: ✅ 已配置,可挂载配置
|
||||
|
||||
### 4.3 前端服务
|
||||
|
||||
```yaml
|
||||
school-news-web:
|
||||
image: school-news-web:latest
|
||||
depends_on:
|
||||
- school-news-serv
|
||||
volumes:
|
||||
- ./config/web-app-config.js:/app/config/app-config.js # ✅ 配置挂载
|
||||
- ./logs/web:/app/logs # ✅ 日志目录
|
||||
```
|
||||
|
||||
**状态**: ✅ 已配置,可外挂配置
|
||||
|
||||
---
|
||||
|
||||
## 📊 5. 整体流程总结
|
||||
|
||||
### 构建流程
|
||||
|
||||
```
|
||||
./build.sh build save serv web
|
||||
↓
|
||||
1. Git Pull
|
||||
└─ 拉取最新代码
|
||||
↓
|
||||
2. 编译后端
|
||||
├─ mvn clean
|
||||
├─ mvn package
|
||||
└─ 产物: admin-1.0.0.jar
|
||||
↓
|
||||
3. 构建前端
|
||||
├─ npm install
|
||||
├─ npm run build
|
||||
└─ 产物: dist/
|
||||
↓
|
||||
4. 构建Docker镜像
|
||||
├─ docker build -t school-news-mysql:${IMAGE_VERSION}
|
||||
├─ docker build -t school-news-serv:${IMAGE_VERSION}
|
||||
├─ docker build -t school-news-web:${IMAGE_VERSION}
|
||||
└─ 同时打 latest 标签
|
||||
↓
|
||||
5. 导出镜像
|
||||
├─ docker save school-news-mysql_${IMAGE_VERSION}.tar
|
||||
├─ docker save school-news-serv_${IMAGE_VERSION}.tar
|
||||
└─ docker save school-news-web_${IMAGE_VERSION}.tar
|
||||
```
|
||||
|
||||
### 部署流程
|
||||
|
||||
```
|
||||
cd docker
|
||||
docker-compose up -d
|
||||
↓
|
||||
MySQL容器启动
|
||||
├─ 执行01-init-database.sh
|
||||
├─ source reInit.sh
|
||||
├─ execute_init_script
|
||||
├─ import_sensitive_words
|
||||
└─ UPDATE Docker配置
|
||||
↓
|
||||
后端容器启动
|
||||
├─ start.sh 更新数据库配置
|
||||
├─ 启动Spring Boot应用
|
||||
└─ 健康检查通过
|
||||
↓
|
||||
前端容器启动
|
||||
├─ start.sh 处理app-config.js
|
||||
├─ 启动Nginx
|
||||
└─ 提供服务
|
||||
↓
|
||||
完成 ✅
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ 检查结论
|
||||
|
||||
### 完全符合要求
|
||||
|
||||
| 检查项 | 要求 | 实际情况 | 状态 |
|
||||
|--------|------|---------|------|
|
||||
| 1.1 Git更新 | 拉取最新代码 | ✅ 支持main/master | ✅ |
|
||||
| 1.2 编译后端 | 生成jar包 | ✅ admin-1.0.0.jar | ✅ |
|
||||
| 1.3 构建前端 | 生成dist | ✅ dist目录 | ✅ |
|
||||
| 1.4 镜像版本 | yyyymmddHHmmss | ✅ `date +%Y%m%d_%H%M%S` | ✅ |
|
||||
| 1.4.1 后端镜像 | jar+爬虫+可挂载配置 | ✅ 完整实现 | ✅ |
|
||||
| 1.4.2 前端镜像 | dist+可外挂配置 | ✅ 完整实现 | ✅ |
|
||||
| 1.4.3 MySQL镜像 | SQL+reInit.sh | ✅ 完整实现 | ✅ |
|
||||
| 2. docker-compose | 运行项目 | ✅ 完整配置 | ✅ |
|
||||
|
||||
### ✅ 镜像构建详情(已确认)
|
||||
|
||||
#### 步骤4: 构建Docker镜像(第150-203行)
|
||||
|
||||
```bash
|
||||
# MySQL镜像
|
||||
docker build -t school-news-mysql:${IMAGE_VERSION} -f docker/Dockerfile.mysql .
|
||||
docker tag school-news-mysql:${IMAGE_VERSION} school-news-mysql:latest
|
||||
|
||||
# 后端镜像
|
||||
docker build -t school-news-serv:${IMAGE_VERSION} -f docker/Dockerfile.serv .
|
||||
docker tag school-news-serv:${IMAGE_VERSION} school-news-serv:latest
|
||||
|
||||
# 前端镜像
|
||||
docker build -t school-news-web:${IMAGE_VERSION} -f docker/Dockerfile.web .
|
||||
docker tag school-news-web:${IMAGE_VERSION} school-news-web:latest
|
||||
```
|
||||
|
||||
**标签策略**: ✅ 每个镜像同时打两个标签
|
||||
- `school-news-xxx:20251124_143025` - 版本标签
|
||||
- `school-news-xxx:latest` - 最新标签
|
||||
|
||||
#### 步骤5: 导出镜像(第206-251行)
|
||||
|
||||
```bash
|
||||
# MySQL镜像
|
||||
docker save -o school-news-mysql_${IMAGE_VERSION}.tar school-news-mysql:${IMAGE_VERSION}
|
||||
|
||||
# 后端镜像
|
||||
docker save -o school-news-serv_${IMAGE_VERSION}.tar school-news-serv:${IMAGE_VERSION}
|
||||
|
||||
# 前端镜像
|
||||
docker save -o school-news-web_${IMAGE_VERSION}.tar school-news-web:${IMAGE_VERSION}
|
||||
```
|
||||
|
||||
**导出位置**: `build-output/`
|
||||
**文件命名**: ✅ 符合要求
|
||||
- `school-news-mysql_20251124_143025.tar`
|
||||
- `school-news-serv_20251124_143025.tar`
|
||||
- `school-news-web_20251124_143025.tar`
|
||||
|
||||
**可选压缩**: ✅ 支持gzip压缩(可选)
|
||||
|
||||
#### 部署说明文件(第277-343行)
|
||||
|
||||
自动生成 `部署说明_${IMAGE_VERSION}.txt`,包含:
|
||||
- ✅ 构建信息(时间、版本、Git信息)
|
||||
- ✅ 镜像文件列表
|
||||
- ✅ 部署步骤(6个步骤)
|
||||
- ✅ 访问地址
|
||||
- ✅ 注意事项
|
||||
|
||||
---
|
||||
|
||||
## ✅ 最终检查结论
|
||||
|
||||
### 所有要求已完全实现
|
||||
|
||||
| 检查项 | 要求 | 实际情况 | 状态 |
|
||||
|--------|------|---------|------|
|
||||
| **1.1 Git更新** | 拉取最新代码 | git pull origin main/master | ✅ |
|
||||
| **1.2 编译后端** | 生成jar包 | mvn package → admin-1.0.0.jar | ✅ |
|
||||
| **1.3 构建前端** | 生成dist | npm run build → dist/ | ✅ |
|
||||
| **1.4 镜像版本** | yyyymmddHHmmss | `date +%Y%m%d_%H%M%S` | ✅ |
|
||||
| **1.4.1 后端镜像** | jar+爬虫+可挂载配置 | ✅ 完整实现 | ✅ |
|
||||
| **1.4.2 前端镜像** | dist+可外挂配置 | ✅ app-config.js外挂 | ✅ |
|
||||
| **1.4.3 MySQL镜像** | SQL+reInit.sh构建 | ✅ 复用reInit.sh | ✅ |
|
||||
| **导出镜像** | 以版本号命名 | school-news-xxx_${IMAGE_VERSION}.tar | ✅ |
|
||||
| **2. docker-compose** | 运行项目 | ✅ 完整配置,服务依赖正确 | ✅ |
|
||||
|
||||
### 额外实现的功能
|
||||
|
||||
| 功能 | 说明 | 价值 |
|
||||
|------|------|------|
|
||||
| 镜像双标签 | VERSION + latest | ✅ 便于部署 |
|
||||
| 可选压缩 | gzip压缩镜像文件 | ✅ 减少传输大小 |
|
||||
| 部署说明 | 自动生成详细说明 | ✅ 降低部署难度 |
|
||||
| 构建验证 | 验证jar/dist存在 | ✅ 提前发现问题 |
|
||||
| 文件大小显示 | 显示各产物大小 | ✅ 便于监控 |
|
||||
|
||||
### 完整构建流程
|
||||
|
||||
```
|
||||
./build.sh build save serv web
|
||||
↓
|
||||
【步骤1】Git Pull
|
||||
└─ 检查未提交更改 → 拉取代码 → 验证
|
||||
↓
|
||||
【步骤2】编译后端
|
||||
└─ mvn clean → mvn package → 验证jar包(45MB)
|
||||
↓
|
||||
【步骤3】构建前端
|
||||
└─ npm install → npm run build → 验证dist(120个文件, 5MB)
|
||||
↓
|
||||
【步骤4】构建镜像
|
||||
├─ MySQL镜像: school-news-mysql:20251124_143025 + latest
|
||||
├─ 后端镜像: school-news-serv:20251124_143025 + latest
|
||||
└─ 前端镜像: school-news-web:20251124_143025 + latest
|
||||
↓
|
||||
【步骤5】导出镜像
|
||||
├─ school-news-mysql_20251124_143025.tar (650MB)
|
||||
├─ school-news-serv_20251124_143025.tar (850MB)
|
||||
├─ school-news-web_20251124_143025.tar (45MB)
|
||||
└─ 可选gzip压缩(节省60%空间)
|
||||
↓
|
||||
【生成文档】
|
||||
└─ 部署说明_20251124_143025.txt
|
||||
↓
|
||||
【构建摘要】
|
||||
└─ 显示所有产物、大小、位置
|
||||
```
|
||||
|
||||
### 部署流程
|
||||
|
||||
```
|
||||
目标服务器
|
||||
↓
|
||||
1. 加载镜像
|
||||
docker load -i school-news-mysql_xxx.tar
|
||||
docker load -i school-news-serv_xxx.tar
|
||||
docker load -i school-news-web_xxx.tar
|
||||
↓
|
||||
2. 验证镜像
|
||||
docker images | grep school-news
|
||||
↓
|
||||
3. 启动服务
|
||||
cd docker
|
||||
docker-compose up -d
|
||||
↓
|
||||
4. 验证服务
|
||||
├─ MySQL: 执行01-init-database.sh → reInit.sh → 初始化完成
|
||||
├─ 后端: start.sh → 更新配置 → Spring Boot启动 → 健康检查
|
||||
└─ 前端: start.sh → 处理app-config.js → Nginx启动
|
||||
↓
|
||||
5. 访问系统
|
||||
http://localhost:8080/schoolNewsWeb/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎉 总体评价
|
||||
|
||||
**状态**: ✅✅✅ **完全符合所有要求**
|
||||
|
||||
### 优势
|
||||
|
||||
1. **完整性** - 所有要求项已100%实现
|
||||
2. **自动化** - 一键构建、导出、生成说明
|
||||
3. **可维护性** - 复用reInit.sh,单一数据源
|
||||
4. **灵活性** - 配置可外挂,无需重建镜像
|
||||
5. **健壮性** - 完善的错误处理和验证
|
||||
6. **文档化** - 自动生成部署说明
|
||||
|
||||
### 设计亮点
|
||||
|
||||
1. **前端配置外挂** - app-config.js方案,真正实现运行时配置
|
||||
2. **MySQL初始化** - 完全复用reInit.sh,避免代码重复
|
||||
3. **环境变量覆盖** - `${VAR:-default}`语法,兼容多环境
|
||||
4. **双标签策略** - VERSION + latest,便于版本管理
|
||||
5. **构建验证** - 每步验证产物,及时发现问题
|
||||
|
||||
---
|
||||
|
||||
**检查时间**: 2025-11-24
|
||||
**检查人员**: Cascade
|
||||
**最终状态**: ✅ **所有检查项通过** 🎉
|
||||
@@ -17,7 +17,8 @@ services:
|
||||
volumes:
|
||||
# 数据持久化
|
||||
- mysql-data:/var/lib/mysql
|
||||
# 配置文件(可选覆盖)
|
||||
# 自定义配置文件(可选,取消注释以启用)
|
||||
# 如需自定义MySQL配置,取消下面的注释并修改mysql/my.cnf
|
||||
# - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
|
||||
command:
|
||||
- --character-set-server=utf8mb4
|
||||
|
||||
@@ -1,372 +0,0 @@
|
||||
# Docker环境数据库初始化指南
|
||||
|
||||
## 📋 概述
|
||||
|
||||
本指南说明如何为Docker环境准备数据库初始化脚本,参考 `schoolNewsServ/.bin/mysql/sql/reInit.sh` 的实现。
|
||||
|
||||
## 🎯 初始化流程
|
||||
|
||||
### MySQL容器启动流程
|
||||
|
||||
```
|
||||
Docker容器启动
|
||||
↓
|
||||
执行 /docker-entrypoint-initdb.d/ 中的脚本(按字母顺序)
|
||||
↓
|
||||
01-init-database.sql → 创建数据库和初始化标记表
|
||||
↓
|
||||
02-create-tables.sql → 创建所有业务表
|
||||
↓
|
||||
03-init-data.sql → 导入初始数据
|
||||
↓
|
||||
数据库就绪
|
||||
```
|
||||
|
||||
## 📂 文件说明
|
||||
|
||||
### 现有文件
|
||||
|
||||
| 文件 | 说明 | 状态 |
|
||||
|------|------|------|
|
||||
| `01-init-database.sql` | 创建数据库和_db_init_status表 | ✅ 已存在 |
|
||||
| `README.md` | 数据库初始化说明 | ✅ 已存在 |
|
||||
|
||||
### 需要准备的文件
|
||||
|
||||
| 文件 | 说明 | 来源 |
|
||||
|------|------|------|
|
||||
| `02-create-tables.sql` | 所有表结构 | 从 createTable*.sql 合并 |
|
||||
| `03-init-data.sql` | 初始数据 | 从 init*.sql 合并 |
|
||||
|
||||
## 🔧 准备方法
|
||||
|
||||
### 方式1: 使用自动脚本(推荐)
|
||||
|
||||
```bash
|
||||
cd docker/init-db
|
||||
chmod +x prepare-sql.sh
|
||||
./prepare-sql.sh
|
||||
```
|
||||
|
||||
脚本会自动:
|
||||
1. 备份现有SQL文件
|
||||
2. 合并所有createTable*.sql到02-create-tables.sql
|
||||
3. 合并所有init*.sql到03-init-data.sql
|
||||
4. 添加Docker特定配置(爬虫路径等)
|
||||
5. 生成统计信息
|
||||
|
||||
### 方式2: 手动复制
|
||||
|
||||
#### 步骤1: 准备表结构
|
||||
|
||||
```bash
|
||||
cd schoolNewsServ/.bin/mysql/sql
|
||||
|
||||
# 合并所有createTable*.sql
|
||||
cat createTableUser.sql \
|
||||
createTablePermission.sql \
|
||||
createTablePermissionControl.sql \
|
||||
createTableResource.sql \
|
||||
createTableCourse.sql \
|
||||
createTableLearning.sql \
|
||||
createTableUserCenter.sql \
|
||||
createTableAI.sql \
|
||||
createTableSystem.sql \
|
||||
createTableAchievement.sql \
|
||||
createTableCrontab.sql \
|
||||
createTableMessage.sql \
|
||||
createTableSensitive.sql \
|
||||
> ../../docker/init-db/02-create-tables.sql
|
||||
```
|
||||
|
||||
#### 步骤2: 准备初始数据
|
||||
|
||||
```bash
|
||||
# 合并所有init*.sql
|
||||
cat initMenuData.sql \
|
||||
initAllData.sql \
|
||||
initCrontabMetaData.sql \
|
||||
> ../../docker/init-db/03-init-data.sql
|
||||
```
|
||||
|
||||
#### 步骤3: 添加Docker配置
|
||||
|
||||
在 `03-init-data.sql` 末尾添加:
|
||||
|
||||
```sql
|
||||
-- Docker环境爬虫配置
|
||||
INSERT IGNORE INTO tb_sys_config (config_key, config_value, config_desc, created_at)
|
||||
VALUES
|
||||
('crawler.pythonPath', '/usr/bin/python3', 'Docker容器内Python路径', NOW()),
|
||||
('crawler.basePath', '/app/crawler', 'Docker容器内爬虫脚本路径', NOW());
|
||||
```
|
||||
|
||||
## 🔍 脚本内容说明
|
||||
|
||||
### initAll.sql 结构
|
||||
|
||||
基于 `schoolNewsServ/.bin/mysql/sql/initAll.sql`:
|
||||
|
||||
```sql
|
||||
-- 1. 创建数据库
|
||||
SOURCE createDB.sql;
|
||||
|
||||
-- 2-14. 创建各模块表
|
||||
SOURCE createTableUser.sql;
|
||||
SOURCE createTablePermission.sql;
|
||||
SOURCE createTablePermissionControl.sql;
|
||||
SOURCE createTableResource.sql;
|
||||
SOURCE createTableCourse.sql;
|
||||
SOURCE createTableLearning.sql;
|
||||
SOURCE createTableUserCenter.sql;
|
||||
SOURCE createTableAI.sql;
|
||||
SOURCE createTableSystem.sql;
|
||||
SOURCE createTableAchievement.sql;
|
||||
SOURCE createTableCrontab.sql;
|
||||
SOURCE createTableMessage.sql;
|
||||
SOURCE createTableSensitive.sql;
|
||||
|
||||
-- 15-17. 插入初始数据
|
||||
SOURCE initMenuData.sql;
|
||||
SOURCE initAllData.sql;
|
||||
SOURCE initCrontabMetaData.sql;
|
||||
```
|
||||
|
||||
### 各模块说明
|
||||
|
||||
| 模块 | 表数量 | 说明 |
|
||||
|------|--------|------|
|
||||
| User | 3+ | 用户、部门、角色 |
|
||||
| Permission | 10+ | 菜单、权限、角色权限 |
|
||||
| Resource | 5+ | 资源、标签、分类 |
|
||||
| Course | 3+ | 课程、章节、课件 |
|
||||
| Learning | 5+ | 学习记录、笔记 |
|
||||
| UserCenter | 3+ | 个人中心、收藏、评论 |
|
||||
| AI | 5+ | AI智能体、对话 |
|
||||
| System | 5+ | 系统配置、日志 |
|
||||
| Achievement | 5+ | 成就系统 |
|
||||
| Crontab | 3+ | 定时任务 |
|
||||
| Message | 3+ | 消息通知 |
|
||||
| Sensitive | 1+ | 敏感词 |
|
||||
|
||||
## ⚠️ 重要注意事项
|
||||
|
||||
### 1. SOURCE语句不支持
|
||||
|
||||
Docker的mysql镜像初始化**不支持** `SOURCE` 语句:
|
||||
|
||||
```sql
|
||||
-- ❌ 不支持
|
||||
SOURCE createTableUser.sql;
|
||||
|
||||
-- ✅ 需要合并成一个文件
|
||||
-- 将所有SQL内容直接写入
|
||||
CREATE TABLE tb_user (...);
|
||||
CREATE TABLE tb_role (...);
|
||||
```
|
||||
|
||||
### 2. 幂等性设计
|
||||
|
||||
确保脚本可以重复执行:
|
||||
|
||||
```sql
|
||||
-- 使用IF NOT EXISTS
|
||||
CREATE TABLE IF NOT EXISTS tb_user (...);
|
||||
|
||||
-- 使用INSERT IGNORE
|
||||
INSERT IGNORE INTO tb_sys_config VALUES (...);
|
||||
|
||||
-- 检查执行状态
|
||||
SET @executed = (SELECT COUNT(*) FROM _db_init_status WHERE script_name = '02-create-tables.sql');
|
||||
```
|
||||
|
||||
### 3. 执行顺序
|
||||
|
||||
文件按字母顺序执行,因此命名很重要:
|
||||
|
||||
```
|
||||
01-init-database.sql (首先执行)
|
||||
02-create-tables.sql (其次执行)
|
||||
03-init-data.sql (最后执行)
|
||||
```
|
||||
|
||||
### 4. 字符集配置
|
||||
|
||||
确保使用UTF-8MB4:
|
||||
|
||||
```sql
|
||||
CREATE TABLE tb_xxx (
|
||||
...
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
```
|
||||
|
||||
## 🧪 测试验证
|
||||
|
||||
### 1. 检查SQL文件
|
||||
|
||||
```bash
|
||||
# 查看文件大小
|
||||
ls -lh docker/init-db/*.sql
|
||||
|
||||
# 检查SQL语法
|
||||
cd docker/init-db
|
||||
mysql --help | grep "Default options"
|
||||
```
|
||||
|
||||
### 2. 本地测试
|
||||
|
||||
```bash
|
||||
# 在本地MySQL测试
|
||||
mysql -uroot -p123456 < docker/init-db/01-init-database.sql
|
||||
mysql -uroot -p123456 < docker/init-db/02-create-tables.sql
|
||||
mysql -uroot -p123456 < docker/init-db/03-init-data.sql
|
||||
```
|
||||
|
||||
### 3. Docker环境测试
|
||||
|
||||
```bash
|
||||
# 删除旧数据
|
||||
docker-compose down -v
|
||||
|
||||
# 启动MySQL
|
||||
docker-compose up -d mysql
|
||||
|
||||
# 查看初始化日志
|
||||
docker logs school-news-mysql 2>&1 | grep -E "init|sql"
|
||||
|
||||
# 检查数据库
|
||||
docker exec school-news-mysql mysql -uroot -p123456 -e "SHOW DATABASES;"
|
||||
docker exec school-news-mysql mysql -uroot -p123456 school_news -e "SHOW TABLES;"
|
||||
|
||||
# 检查默认用户
|
||||
docker exec school-news-mysql mysql -uroot -p123456 school_news -e \
|
||||
"SELECT username, nickname FROM tb_sys_user WHERE username='admin';"
|
||||
```
|
||||
|
||||
### 4. 验证初始化状态
|
||||
|
||||
```bash
|
||||
# 查看初始化记录
|
||||
docker exec school-news-mysql mysql -uroot -p123456 school_news -e \
|
||||
"SELECT * FROM _db_init_status ORDER BY executed_at;"
|
||||
|
||||
# 统计表数量
|
||||
docker exec school-news-mysql mysql -uroot -p123456 school_news -e \
|
||||
"SELECT COUNT(*) AS table_count FROM information_schema.tables WHERE table_schema='school_news';"
|
||||
```
|
||||
|
||||
## 🔄 更新数据库结构
|
||||
|
||||
### 场景1: 本地开发添加了新表
|
||||
|
||||
1. 在 `schoolNewsServ/.bin/mysql/sql/` 中创建SQL文件
|
||||
2. 更新 `initAll.sql` 添加SOURCE语句
|
||||
3. 重新运行 `prepare-sql.sh`
|
||||
4. 重新构建Docker镜像
|
||||
|
||||
### 场景2: 修改现有表结构
|
||||
|
||||
1. 创建迁移脚本 `04-migration-xxx.sql`
|
||||
2. 放入 `docker/init-db/` 目录
|
||||
3. 脚本会自动执行(按字母顺序)
|
||||
|
||||
示例迁移脚本:
|
||||
|
||||
```sql
|
||||
-- 04-migration-add-column.sql
|
||||
USE school_news;
|
||||
|
||||
-- 检查是否已执行
|
||||
SET @executed = (SELECT COUNT(*) FROM _db_init_status WHERE script_name = '04-migration-add-column.sql');
|
||||
|
||||
-- 添加新列
|
||||
ALTER TABLE tb_user ADD COLUMN IF NOT EXISTS new_column VARCHAR(255);
|
||||
|
||||
-- 记录执行
|
||||
INSERT IGNORE INTO _db_init_status (script_name) VALUES ('04-migration-add-column.sql');
|
||||
```
|
||||
|
||||
## 📊 默认数据说明
|
||||
|
||||
### 默认用户
|
||||
|
||||
| 用户名 | 密码 | 角色 | 说明 |
|
||||
|--------|------|------|------|
|
||||
| admin | admin123 | 管理员 | 超级管理员账号 |
|
||||
|
||||
### 默认角色
|
||||
|
||||
| 角色 | 说明 |
|
||||
|------|------|
|
||||
| admin | 管理员,拥有所有权限 |
|
||||
| freedom | 自由角色,基础权限 |
|
||||
|
||||
### 默认部门
|
||||
|
||||
| 部门 | 说明 |
|
||||
|------|------|
|
||||
| root_department | 超级部门 |
|
||||
| default_department | 默认部门 |
|
||||
|
||||
### 系统配置
|
||||
|
||||
| 配置项 | 值 | 说明 |
|
||||
|--------|-----|------|
|
||||
| crawler.pythonPath | /usr/bin/python3 | Python路径 |
|
||||
| crawler.basePath | /app/crawler | 爬虫脚本路径 |
|
||||
|
||||
## 🛠️ 故障排查
|
||||
|
||||
### 问题1: 初始化脚本未执行
|
||||
|
||||
**症状**: 数据库创建了但表不存在
|
||||
|
||||
**排查**:
|
||||
```bash
|
||||
# 查看MySQL日志
|
||||
docker logs school-news-mysql
|
||||
|
||||
# 检查脚本权限
|
||||
ls -l docker/init-db/*.sql
|
||||
```
|
||||
|
||||
**解决**: 确保SQL文件有读权限
|
||||
|
||||
### 问题2: SQL语法错误
|
||||
|
||||
**症状**: 容器启动失败
|
||||
|
||||
**排查**:
|
||||
```bash
|
||||
# 查看详细错误
|
||||
docker logs school-news-mysql 2>&1 | grep ERROR
|
||||
```
|
||||
|
||||
**解决**: 检查SQL语法,在本地测试
|
||||
|
||||
### 问题3: 重复执行导致错误
|
||||
|
||||
**症状**: 主键冲突等错误
|
||||
|
||||
**解决**: 使用幂等设计
|
||||
```sql
|
||||
-- 使用INSERT IGNORE
|
||||
INSERT IGNORE INTO ...
|
||||
|
||||
-- 使用ON DUPLICATE KEY UPDATE
|
||||
INSERT INTO ... ON DUPLICATE KEY UPDATE ...
|
||||
|
||||
-- 检查执行状态
|
||||
IF NOT EXISTS (SELECT ...)
|
||||
```
|
||||
|
||||
## 📚 相关文档
|
||||
|
||||
- [数据库初始化README](README.md)
|
||||
- [reInit.sh源文件](../../schoolNewsServ/.bin/mysql/sql/reInit.sh)
|
||||
- [MySQL Docker文档](https://hub.docker.com/_/mysql)
|
||||
|
||||
---
|
||||
|
||||
**更新时间**: 2025-11-24
|
||||
**基于**: schoolNewsServ/.bin/mysql/sql/reInit.sh
|
||||
Reference in New Issue
Block a user