#!/bin/sh set -e # 日志函数(带时间戳) log_info() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] [DB_INIT] $1" } log_error() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] [DB_ERROR] $1" >&2 } # 1. 启动PostgreSQL服务 log_info "启动PostgreSQL服务(后台运行)" docker-entrypoint.sh postgres & PG_PID=$! log_info "PostgreSQL主进程ID: $PG_PID" # 2. 等待数据库就绪 log_info "等待PostgreSQL服务就绪(主机: localhost, 端口: 5432)" retry_count=0 max_retries=30 # 最多等待30秒 until pg_isready -U "$POSTGRES_USER" -d "$POSTGRES_DB" -h "localhost" -p "5432"; do retry_count=$((retry_count + 1)) if [ $retry_count -ge $max_retries ]; then log_error "等待PostgreSQL超时(超过30秒)" exit 1 fi log_info "数据库未就绪,等待1秒(重试次数: $retry_count)" sleep 1 done log_info "PostgreSQL服务已就绪" # 3. 执行SQL脚本 log_info "开始执行/docker-entrypoint-initdb.d目录下的SQL脚本" script_count=0 for script in /docker-entrypoint-initdb.d/*.sql; do if [ -f "$script" ]; then script_count=$((script_count + 1)) log_info "执行脚本 ($script_count): $script" if psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" -h "localhost" -p "5432" -f "$script" --set=ON_ERROR_STOP=1; then log_info "脚本执行成功: $script" else log_error "脚本执行失败: $script" exit 1 fi fi done if [ $script_count -eq 0 ]; then log_info "未发现需要执行的SQL脚本" else log_info "所有SQL脚本执行完成(共$script_count个)" fi # 4. 等待主进程 log_info "等待PostgreSQL主进程结束(PID: $PG_PID)" wait $PG_PID log_info "PostgreSQL进程已退出"