Files
schoolNews/docker/Dockerfile.mysql

113 lines
3.8 KiB
Docker
Raw Normal View History

2025-11-24 11:50:15 +08:00
# 校园新闻管理系统 - MySQL数据库镜像
# 基于reInit.sh的数据库初始化方案
FROM mysql:8.0
# 设置环境变量
ENV LANG=C.UTF-8 \
TZ=Asia/Shanghai
2025-11-24 12:59:51 +08:00
# 注意MySQL配置有两种方式
# 1. 通过docker-compose.yml的command参数基础配置
# 2. 通过挂载my.cnf文件高级配置可选
# docker-compose.yml中可以取消注释: ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
2025-11-24 11:50:15 +08:00
# 创建SQL目录
RUN mkdir -p /docker-entrypoint-initdb.d /opt/sql
# 复制所有SQL文件保持目录结构
COPY schoolNewsServ/.bin/mysql/sql/ /opt/sql/
2025-11-24 16:53:17 +08:00
# 复制并调整reInit.sh为Docker环境设置执行权限
2025-11-24 11:50:15 +08:00
COPY schoolNewsServ/.bin/mysql/sql/reInit.sh /opt/sql/
RUN sed -i 's/DB_HOST="localhost"/DB_HOST="localhost"/' /opt/sql/reInit.sh && \
sed -i 's/DB_PORT="3306"/DB_PORT="3306"/' /opt/sql/reInit.sh && \
sed -i 's/DB_USER="root"/DB_USER="root"/' /opt/sql/reInit.sh && \
sed -i 's/DB_PASSWORD="123456"/DB_PASSWORD="${MYSQL_ROOT_PASSWORD}"/' /opt/sql/reInit.sh && \
sed -i 's/DB_NAME="school_news"/DB_NAME="${MYSQL_DATABASE}"/' /opt/sql/reInit.sh && \
2025-11-24 16:53:17 +08:00
sed -i 's|LOG_FILE="$SCRIPT_DIR/reInit.log"|LOG_FILE="/tmp/reInit.log"|' /opt/sql/reInit.sh && \
chmod +x /opt/sql/reInit.sh && \
chmod +x /opt/sql/sensitiveData/importSensitiveWords.sh
2025-11-24 11:50:15 +08:00
# 创建Docker初始化适配脚本
RUN cat > /docker-entrypoint-initdb.d/01-init-database.sh <<'EOF'
#!/bin/bash
set -e
echo "=========================================="
echo "校园新闻管理系统 - 数据库初始化"
echo "使用 reInit.sh + Docker配置更新"
echo "=========================================="
# 等待MySQL完全启动
echo "等待MySQL启动..."
until mysql -uroot -p"${MYSQL_ROOT_PASSWORD}" -e "SELECT 1" >/dev/null 2>&1; do
sleep 1
done
echo "MySQL已就绪"
# 切换到SQL目录
cd /opt/sql
# 设置环境变量供reInit.sh使用
export DB_HOST="localhost"
export DB_PORT="3306"
export DB_USER="root"
export DB_PASSWORD="${MYSQL_ROOT_PASSWORD}"
export DB_NAME="${MYSQL_DATABASE}"
export MYSQL_PWD="${MYSQL_ROOT_PASSWORD}"
# Source reInit.sh并调用其初始化函数
2025-11-24 16:53:17 +08:00
echo "执行数据库初始化使用reInit.sh..."
2025-11-24 11:50:15 +08:00
source reInit.sh
# 调用reInit.sh的核心函数跳过备份和删除
execute_init_script # 执行initAll.sql
import_sensitive_words # 导入敏感词
2025-11-24 12:59:51 +08:00
2025-11-24 17:41:28 +08:00
# Docker环境特定配置更新爬虫路径并标记初始化状态
2025-11-24 11:50:15 +08:00
echo "更新Docker环境配置..."
mysql -uroot "${MYSQL_DATABASE}" <<EOSQL
2025-11-24 17:41:28 +08:00
-- 确保初始化标记表存在
CREATE TABLE IF NOT EXISTS _db_init_status (
id INT PRIMARY KEY AUTO_INCREMENT,
script_name VARCHAR(255) NOT NULL UNIQUE,
executed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
status VARCHAR(50) DEFAULT 'init'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 确保有一条当前脚本的记录
INSERT IGNORE INTO _db_init_status (script_name) VALUES ('01-init-database.sql');
2025-11-24 11:50:15 +08:00
-- 更新爬虫配置为Docker容器内路径
UPDATE tb_sys_config
SET config_value = '/usr/bin/python3'
WHERE config_key = 'crawler.pythonPath';
UPDATE tb_sys_config
SET config_value = '/app/crawler'
WHERE config_key = 'crawler.basePath';
2025-11-24 17:41:28 +08:00
-- 将初始化状态标记为 success供 healthcheck 使用
2025-11-24 16:53:17 +08:00
UPDATE _db_init_status
SET status = 'success'
WHERE script_name = '01-init-database.sql';
2025-11-24 11:50:15 +08:00
SELECT '✅ 数据库初始化完成!' AS message;
2025-11-24 17:41:28 +08:00
SELECT '默认用户: admin, 密码: 123456' AS tip;
2025-11-24 11:50:15 +08:00
SELECT '爬虫配置已更新为Docker容器路径' AS docker_config;
EOSQL
echo "=========================================="
echo "✅ 初始化完成!"
echo "=========================================="
EOF
# 设置执行权限
RUN chmod +x /docker-entrypoint-initdb.d/01-init-database.sh
# 暴露端口
EXPOSE 3306
# 健康检查
HEALTHCHECK --interval=10s --timeout=5s --retries=5 --start-period=30s \
CMD mysqladmin ping -h localhost -p${MYSQL_ROOT_PASSWORD} || exit 1