Files
wiki/qModel/docker/database/dm8/entrypoint-arm64.sh
T
2026-05-14 16:56:48 +08:00

143 lines
3.9 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/sh
set -e
DM_PATH=/home/dmdba/dmdbms
DM_DATA_DIR=/home/dmdba/data/DAMENG
INIT_SQL=/home/dmdba/initdata/init-qmodel.sql
FIRST_RUN_FLAG=/var/run/qmodel_init.done
PORT=${PORT_NUM:-5236}
# ---------- 检查是否已经初始化 ----------
check_is_init() {
if [ -d "${DM_DATA_DIR}" ]; then
DATABASE_ALREADY_EXISTS=true
fi
}
# ---------- 初始化数据库 ----------
db_init() {
echo "[dm8] init db ..."
mkdir -p "${DM_DATA_DIR}"
chown -R dmdba "${DM_DATA_DIR}"
cd "${DM_PATH}/bin"
# 初始化参数,参考你原来的需求
INIT_ARGS="PATH=/home/dmdba/data DB_NAME=DAMENG PORT_NUM=${PORT} PAGE_SIZE=16 CHARSET=1 LENGTH_IN_CHAR=1 CASE_SENSITIVE=${CASE_SENSITIVE:-0}"
if [ -n "${SYSDBA_PWD}" ]; then
INIT_ARGS="${INIT_ARGS} SYSDBA_PWD=${SYSDBA_PWD}"
fi
if [ -n "${SYSAUDITOR_PWD}" ]; then
INIT_ARGS="${INIT_ARGS} SYSAUDITOR_PWD=${SYSAUDITOR_PWD}"
fi
echo "[dm8] dminit ${INIT_ARGS}"
gosu dmdba "${DM_PATH}/bin/dminit" ${INIT_ARGS}
echo "[dm8] db init done."
}
# ---------- 等待 dmserver TCP 端口可用(参考老版本逻辑) ----------
wait_dm_ready() {
echo "[dm8] wait dmserver tcp on 127.0.0.1:${PORT} ..."
i=0
max=6000 # 最多等 6000 秒
while [ $i -lt $max ]; do
# 使用 /dev/tcp 检测端口是否可连
if (echo >"/dev/tcp/127.0.0.1/${PORT}") >/dev/null 2>&1; then
echo "[dm8] dmserver tcp ready."
return 0
fi
i=`expr $i + 1`
sleep 1
done
echo "[dm8] WARN: dmserver tcp not ready after ${max}s, continue anyway."
return 1
}
# ---------- 首次启动时导入 init-qmodel.sql ----------
run_init_sql_once() {
# 已经执行过了就直接跳过
if [ -f "${FIRST_RUN_FLAG}" ]; then
echo "[dm8] qModel init already done, skip."
return 0
fi
# 没有 SQL 文件就不导入,避免每次都尝试
if [ ! -f "${INIT_SQL}" ]; then
echo "[dm8] ${INIT_SQL} not found, skip qModel init."
mkdir -p "$(dirname "${FIRST_RUN_FLAG}")"
touch "${FIRST_RUN_FLAG}"
return 0
fi
# 必要环境变量没配也跳过
if [ -z "${QMODEL_USER}" ] || [ -z "${QMODEL_PWD}" ] || [ -z "${SYSDBA_PWD}" ]; then
echo "[dm8] QMODEL_USER / QMODEL_PWD / SYSDBA_PWD not set, skip qModel init."
mkdir -p "$(dirname "${FIRST_RUN_FLAG}")"
touch "${FIRST_RUN_FLAG}"
return 0
fi
# 仅用 TCP 端口检测等待服务就绪
wait_dm_ready
echo "[dm8] start create business user and import init-qmodel.sql ..."
# 为了防止“用户已存在”等导致整个容器退出,这里临时关掉 set -e
set +e
# 1) SYSDBA 创建业务用户并授权
gosu dmdba "${DM_PATH}/bin/disql" "SYSDBA/${SYSDBA_PWD}@127.0.0.1:${PORT}" <<EOF
create user "${QMODEL_USER}" identified by "${QMODEL_PWD}" hash with SHA512 salt;
grant "PUBLIC","SOI","DBA" to "${QMODEL_USER}";
commit;
EOF
# 2) 业务用户执行初始化脚本
gosu dmdba "${DM_PATH}/bin/disql" "${QMODEL_USER}/${QMODEL_PWD}@127.0.0.1:${PORT}" <<EOF
set define off;
set CHAR_CODE UTF8;
\`${INIT_SQL}
set define on;
EOF
# 恢复 set -e
set -e
mkdir -p "$(dirname "${FIRST_RUN_FLAG}")"
touch "${FIRST_RUN_FLAG}"
echo "[dm8] qModel init finished."
}
# ---------- 主流程 ----------
check_is_init
if [ -z "${DATABASE_ALREADY_EXISTS}" ]; then
db_init
else
echo "[dm8] db already exists, skip dminit."
fi
# 安装服务(修复你原脚本里的那一处 `DmAPService}` 的 bug
if [ ! -f "${DM_PATH}/bin/DmAPService" ]; then
"${DM_PATH}/script/root/dm_service_installer.sh" -s "${DM_PATH}/bin/DmAPService"
fi
if [ ! -f "${DM_PATH}/bin/DmServiceDMSERVER" ]; then
"${DM_PATH}/script/root/dm_service_installer.sh" -t dmserver -p "DMSERVER" -dm_ini "${DM_DATA_DIR}/dm.ini"
fi
# 启动服务
gosu dmdba "${DM_PATH}/bin/DmAPService" start
gosu dmdba "${DM_PATH}/bin/DmServiceDMSERVER" start
# 首次导入任务放到后台,不阻塞主进程
run_init_sql_once &
# 保持容器前台进程:沿用原脚本 tail 日志
exec gosu dmdba tail -f /home/dmdba/dmdbms/log/DmServiceDMSERVER.log