#!/bin/bash # 设置配置变量 CACHE_DIR=".docker-cache/pip" BUILD_ARGS="--build-arg BUILDKIT_INLINE_CACHE=1" COMPOSE_FILE="docker-compose.yml" CLEAN_CACHE=0 REBUILD=0 SERVICE="" # 解析命令行参数 while [[ $# -gt 0 ]]; do case "$1" in --clean) CLEAN_CACHE=1 shift ;; --rebuild) REBUILD=1 shift ;; --service) SERVICE="$2" shift 2 ;; --help) echo "用法: ./build_docker.sh [选项]" echo "选项:" echo " --clean 清理缓存目录" echo " --rebuild 强制重新构建镜像" echo " --service 指定要构建的服务名称" echo " --help 显示此帮助信息" exit 0 ;; *) echo "未知选项: $1" echo "使用 --help 查看帮助" exit 1 ;; esac done # 检测操作系统类型 OS_TYPE=$(uname -s) echo "检测到操作系统: $OS_TYPE" # 检查Docker是否安装 if ! command -v docker &> /dev/null; then echo "错误: Docker未安装" echo "请先安装Docker: https://docs.docker.com/get-docker/" exit 1 fi # 检查Docker是否运行 if ! docker info &> /dev/null; then echo "错误: Docker未运行" echo "请启动Docker服务" exit 1 fi # 检查docker-compose.yml文件是否存在 if [ ! -f "$COMPOSE_FILE" ]; then echo "错误: 未找到$COMPOSE_FILE文件" echo "请确保在正确的目录中运行此脚本" exit 1 fi # 设置Docker BuildKit环境变量 export DOCKER_BUILDKIT=1 export COMPOSE_DOCKER_CLI_BUILD=1 echo "启用Docker BuildKit加速构建..." # 清理缓存(如果指定) if [ $CLEAN_CACHE -eq 1 ]; then echo "清理缓存目录..." rm -rf "$CACHE_DIR" fi # 创建缓存目录 mkdir -p "$CACHE_DIR" # 添加构建时间标记 BUILD_TIME=$(date +"%Y%m%d_%H%M%S") BUILD_ARGS="$BUILD_ARGS --build-arg BUILD_TIME=$BUILD_TIME" # 获取脚本所在目录 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 获取项目根目录(脚本所在目录的父目录) PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" echo "脚本目录: $SCRIPT_DIR" echo "项目根目录: $PROJECT_ROOT" # 切换到项目根目录 cd "$PROJECT_ROOT" # 检查Docker Compose命令 if command -v docker-compose &> /dev/null; then COMPOSE_CMD="docker-compose" echo "使用 docker-compose 命令" elif docker compose version &> /dev/null; then COMPOSE_CMD="docker compose" echo "使用 docker compose 命令" else echo "错误: 未找到Docker Compose命令" echo "请安装Docker Compose: https://docs.docker.com/compose/install/" exit 1 fi # 检测CPU核心数,用于并行构建 CPU_CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 2) if [ $CPU_CORES -gt 2 ]; then PARALLEL_FLAG="--parallel" echo "检测到${CPU_CORES}个CPU核心,启用并行构建..." else PARALLEL_FLAG="" fi # 构建命令基础部分 BUILD_CMD="$COMPOSE_CMD -f \"$SCRIPT_DIR/docker-compose.yml\" build $PARALLEL_FLAG --build-arg BUILDKIT_INLINE_CACHE=1" # 根据操作系统类型执行不同的命令 if [[ "$OS_TYPE" == "Darwin" ]]; then # macOS echo "在macOS上构建Docker镜像..." eval $BUILD_CMD elif [[ "$OS_TYPE" == "Linux" ]]; then # Linux echo "在Linux上构建Docker镜像..." eval $BUILD_CMD elif [[ "$OS_TYPE" == MINGW* ]] || [[ "$OS_TYPE" == CYGWIN* ]] || [[ "$OS_TYPE" == MSYS* ]]; then # Windows echo "在Windows上构建Docker镜像..." eval $BUILD_CMD else echo "未知操作系统,尝试使用标准命令构建..." eval $BUILD_CMD fi # 检查构建结果 if [ $? -eq 0 ]; then echo "Docker镜像构建成功!" echo "构建时间: $BUILD_TIME" echo "可以使用以下命令启动容器:" echo "$COMPOSE_CMD -f \"$SCRIPT_DIR/docker-compose.yml\" up -d" else echo "Docker镜像构建失败,请检查错误信息。" exit 1 fi