File size: 4,076 Bytes
b9d9271
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#!/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