Files
xingrin/docker/scripts/common.sh

85 lines
2.4 KiB
Bash

#!/bin/bash
# 公共函数库 - 被其他脚本 source 引用
# ==================== 颜色定义 ====================
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
# ==================== 日志函数 ====================
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
# ==================== Docker 环境检查 ====================
check_docker() {
if ! command -v docker >/dev/null 2>&1; then
log_error "未检测到 docker 命令,请先安装 Docker。"
exit 1
fi
if ! docker info >/dev/null 2>&1; then
log_error "Docker 守护进程未运行,请先启动 Docker。"
exit 1
fi
}
# ==================== Docker Compose 命令检测 ====================
detect_compose_cmd() {
if docker compose version >/dev/null 2>&1; then
COMPOSE_CMD="docker compose"
elif command -v docker-compose >/dev/null 2>&1; then
COMPOSE_CMD="docker-compose"
else
log_error "未检测到 docker-compose 或 docker compose。"
exit 1
fi
export COMPOSE_CMD
}
# ==================== 环境变量文件检查 ====================
check_env_file() {
if [ ! -f .env ]; then
log_error "未找到 .env 配置文件。"
echo " 请先根据 .env.example 创建 .env 文件。"
exit 1
fi
}
# ==================== 数据库配置检测 ====================
detect_db_profile() {
DB_HOST=$(grep -E "^DB_HOST=" .env | cut -d'=' -f2 | tr -d ' "'"'" || echo "postgres")
if [[ "$DB_HOST" == "postgres" || "$DB_HOST" == "localhost" || "$DB_HOST" == "127.0.0.1" ]]; then
echo "[DB] 使用本地 PostgreSQL 容器"
PROFILE_ARG="--profile local-db"
else
echo "[DB] 使用远程 PostgreSQL: $DB_HOST"
PROFILE_ARG=""
fi
export PROFILE_ARG
}
# ==================== 获取 docker 目录路径 ====================
get_docker_dir() {
# common.sh 位于 docker/scripts/,所以 docker 目录是上一级
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
echo "$(dirname "$script_dir")"
}
# ==================== 初始化检查(一次性调用) ====================
init_docker_env() {
DOCKER_DIR="$(get_docker_dir)"
cd "$DOCKER_DIR"
check_docker
detect_compose_cmd
export DOCKER_DIR
}
init_docker_env_with_env_check() {
init_docker_env
check_env_file
}