|
#!/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 "用法 | Usage: ./build_docker.sh [选项 | options]" |
|
echo "选项 | Options:" |
|
echo " --clean 清理缓存目录 | Clean cache directory" |
|
echo " --rebuild 强制重新构建镜像 | Force rebuild image" |
|
echo " --service 指定要构建的服务名称 | Specify service name to build" |
|
echo " --help 显示此帮助信息 | Show this help message" |
|
exit 0 |
|
;; |
|
*) |
|
echo "未知选项 | Unknown option: $1" |
|
echo "使用 --help 查看帮助 | Use --help to see help" |
|
exit 1 |
|
;; |
|
esac |
|
done |
|
|
|
|
|
OS_TYPE=$(uname -s) |
|
echo "检测到操作系统 | Detected OS: $OS_TYPE" |
|
|
|
|
|
if ! command -v docker &> /dev/null; then |
|
echo "错误 | Error: Docker未安装 | Docker not installed" |
|
echo "请先安装Docker | Please install Docker first: https://docs.docker.com/get-docker/" |
|
exit 1 |
|
fi |
|
|
|
|
|
if ! docker info &> /dev/null; then |
|
echo "错误 | Error: Docker未运行 | Docker not running" |
|
echo "请启动Docker服务 | Please start Docker service" |
|
exit 1 |
|
fi |
|
|
|
|
|
if [ ! -f "$COMPOSE_FILE" ]; then |
|
echo "错误 | Error: 未找到$COMPOSE_FILE文件 | $COMPOSE_FILE file not found" |
|
echo "请确保在正确的目录中运行此脚本 | Please make sure you are running this script in the correct directory" |
|
exit 1 |
|
fi |
|
|
|
|
|
export DOCKER_BUILDKIT=1 |
|
export COMPOSE_DOCKER_CLI_BUILD=1 |
|
|
|
echo "启用Docker BuildKit加速构建... | Enabling Docker BuildKit to accelerate build..." |
|
|
|
|
|
if [ $CLEAN_CACHE -eq 1 ]; then |
|
echo "清理缓存目录... | Cleaning cache directory..." |
|
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 directory: $SCRIPT_DIR" |
|
echo "项目根目录 | Project root directory: $PROJECT_ROOT" |
|
|
|
|
|
cd "$PROJECT_ROOT" |
|
|
|
|
|
if command -v docker-compose &> /dev/null; then |
|
COMPOSE_CMD="docker-compose" |
|
echo "使用 docker-compose 命令 | Using docker-compose command" |
|
elif docker compose version &> /dev/null; then |
|
COMPOSE_CMD="docker compose" |
|
echo "使用 docker compose 命令 | Using docker compose command" |
|
else |
|
echo "错误 | Error: 未找到Docker Compose命令 | Docker Compose command not found" |
|
echo "请安装Docker Compose | Please install Docker Compose: https://docs.docker.com/compose/install/" |
|
exit 1 |
|
fi |
|
|
|
|
|
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核心,启用并行构建... | Detected ${CPU_CORES} CPU cores, enabling parallel build..." |
|
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 |
|
|
|
echo "在macOS上构建Docker镜像... | Building Docker image on macOS..." |
|
eval $BUILD_CMD |
|
elif [[ "$OS_TYPE" == "Linux" ]]; then |
|
|
|
echo "在Linux上构建Docker镜像... | Building Docker image on Linux..." |
|
eval $BUILD_CMD |
|
elif [[ "$OS_TYPE" == MINGW* ]] || [[ "$OS_TYPE" == CYGWIN* ]] || [[ "$OS_TYPE" == MSYS* ]]; then |
|
|
|
echo "在Windows上构建Docker镜像... | Building Docker image on Windows..." |
|
eval $BUILD_CMD |
|
else |
|
echo "未知操作系统,尝试使用标准命令构建... | Unknown OS, trying to build with standard command..." |
|
eval $BUILD_CMD |
|
fi |
|
|
|
|
|
if [ $? -eq 0 ]; then |
|
echo "Docker镜像构建成功! | Docker image build successful!" |
|
echo "构建时间 | Build time: $BUILD_TIME" |
|
echo "可以使用以下命令启动容器: | You can use the following command to start the container:" |
|
echo "$COMPOSE_CMD -f \"$SCRIPT_DIR/docker-compose.yml\" up -d" |
|
else |
|
echo "Docker镜像构建失败,请检查错误信息。 | Docker image build failed, please check error messages." |
|
exit 1 |
|
fi |