Wendong-Fan commited on
Commit
22fd20f
·
2 Parent(s): e891a8a 79442fa

optimization bat (#93)

Browse files
.container/Dockerfile CHANGED
@@ -1,15 +1,53 @@
1
- FROM python:3.10-slim
 
 
 
2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  WORKDIR /app
4
 
5
  # 设置pip镜像源以加速下载
6
- RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
 
 
 
 
7
 
8
  # 优化apt安装,减少层数
9
  RUN apt-get update && apt-get install -y --no-install-recommends \
10
- build-essential \
11
  curl \
12
- software-properties-common \
13
  git \
14
  ffmpeg \
15
  libsm6 \
@@ -21,17 +59,16 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
21
  && apt-get clean \
22
  && rm -rf /var/lib/apt/lists/*
23
 
24
- # 先复制并安装requirements.txt,利用Docker缓存机制
25
- COPY requirements.txt .
26
- # 启用pip缓存以加速构建
27
- RUN pip install -r requirements.txt
28
-
29
  # 安装 Playwright 依赖(使用国内镜像源)
30
  ENV PLAYWRIGHT_BROWSERS_PATH=/root/.cache/ms-playwright
31
- ENV PLAYWRIGHT_DOWNLOAD_HOST=https://npmmirror.com/mirrors/playwright
32
- RUN pip install playwright && \
 
33
  playwright install --with-deps chromium
34
 
 
 
 
35
  # 复制项目文件
36
  COPY owl/ ./owl/
37
  COPY licenses/ ./licenses/
@@ -42,9 +79,6 @@ COPY README_zh.md .
42
  # 设置环境变量文件
43
  COPY owl/.env_template ./owl/.env
44
 
45
- # 设置工作目录
46
- WORKDIR /app/owl
47
-
48
  # 创建启动脚本
49
  RUN echo '#!/bin/bash\nxvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" python "$@"' > /usr/local/bin/xvfb-python && \
50
  chmod +x /usr/local/bin/xvfb-python
@@ -53,5 +87,20 @@ RUN echo '#!/bin/bash\nxvfb-run --auto-servernum --server-args="-screen 0 1280x9
53
  RUN echo '#!/bin/bash\necho "欢迎使用OWL项目Docker环境!"\necho ""\necho "可用的脚本:"\nls -1 *.py | grep -v "__" | sed "s/^/- /"\necho ""\necho "运行示例:"\necho " xvfb-python run.py # 运行默认脚本"\necho " xvfb-python run_deepseek_example.py # 运行DeepSeek示例"\necho ""\necho "或者使用自定义查询:"\necho " xvfb-python run.py \"你的问题\""\necho ""' > /usr/local/bin/owl-welcome && \
54
  chmod +x /usr/local/bin/owl-welcome
55
 
56
- # 容器启动命令(改为交互式shell)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
  CMD ["/bin/bash", "-c", "owl-welcome && /bin/bash"]
 
1
+ # 使用ARG定义可配置的构建参数
2
+ ARG PYTHON_VERSION=3.10
3
+ ARG PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple
4
+ ARG PLAYWRIGHT_DOWNLOAD_HOST=https://npmmirror.com/mirrors/playwright
5
 
6
+ # 第一阶段:构建依赖
7
+ FROM python:${PYTHON_VERSION}-slim AS builder
8
+
9
+ # 设置工作目录
10
+ WORKDIR /build
11
+
12
+ # 设置pip镜像源以加速下载
13
+ ARG PIP_INDEX_URL
14
+ RUN pip config set global.index-url ${PIP_INDEX_URL}
15
+
16
+ # 安装构建依赖
17
+ RUN apt-get update && apt-get install -y --no-install-recommends \
18
+ build-essential \
19
+ && apt-get clean \
20
+ && rm -rf /var/lib/apt/lists/*
21
+
22
+ # 复制并安装requirements.txt
23
+ COPY requirements.txt .
24
+ RUN pip install --no-cache-dir --prefix=/install -r requirements.txt
25
+
26
+ # 第二阶段:运行时环境
27
+ FROM python:${PYTHON_VERSION}-slim
28
+
29
+ # 添加构建信息标签
30
+ ARG BUILD_DATE
31
+ ARG VERSION
32
+ LABEL org.opencontainers.image.created="${BUILD_DATE}" \
33
+ org.opencontainers.image.version="${VERSION}" \
34
+ org.opencontainers.image.title="OWL Project" \
35
+ org.opencontainers.image.description="OWL Project Docker Image" \
36
+ org.opencontainers.image.source="https://github.com/yourusername/owl"
37
+
38
+ # 设置工作目录
39
  WORKDIR /app
40
 
41
  # 设置pip镜像源以加速下载
42
+ ARG PIP_INDEX_URL
43
+ RUN pip config set global.index-url ${PIP_INDEX_URL}
44
+
45
+ # 从builder阶段复制已安装的Python包
46
+ COPY --from=builder /install /usr/local
47
 
48
  # 优化apt安装,减少层数
49
  RUN apt-get update && apt-get install -y --no-install-recommends \
 
50
  curl \
 
51
  git \
52
  ffmpeg \
53
  libsm6 \
 
59
  && apt-get clean \
60
  && rm -rf /var/lib/apt/lists/*
61
 
 
 
 
 
 
62
  # 安装 Playwright 依赖(使用国内镜像源)
63
  ENV PLAYWRIGHT_BROWSERS_PATH=/root/.cache/ms-playwright
64
+ ARG PLAYWRIGHT_DOWNLOAD_HOST
65
+ ENV PLAYWRIGHT_DOWNLOAD_HOST=${PLAYWRIGHT_DOWNLOAD_HOST}
66
+ RUN pip install --no-cache-dir playwright && \
67
  playwright install --with-deps chromium
68
 
69
+ # 创建非root用户
70
+ RUN groupadd -r owl && useradd -r -g owl -m owl
71
+
72
  # 复制项目文件
73
  COPY owl/ ./owl/
74
  COPY licenses/ ./licenses/
 
79
  # 设置环境变量文件
80
  COPY owl/.env_template ./owl/.env
81
 
 
 
 
82
  # 创建启动脚本
83
  RUN echo '#!/bin/bash\nxvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" python "$@"' > /usr/local/bin/xvfb-python && \
84
  chmod +x /usr/local/bin/xvfb-python
 
87
  RUN echo '#!/bin/bash\necho "欢迎使用OWL项目Docker环境!"\necho ""\necho "可用的脚本:"\nls -1 *.py | grep -v "__" | sed "s/^/- /"\necho ""\necho "运行示例:"\necho " xvfb-python run.py # 运行默认脚本"\necho " xvfb-python run_deepseek_example.py # 运行DeepSeek示例"\necho ""\necho "或者使用自定义查询:"\necho " xvfb-python run.py \"你的问题\""\necho ""' > /usr/local/bin/owl-welcome && \
88
  chmod +x /usr/local/bin/owl-welcome
89
 
90
+ # 设置工作目录
91
+ WORKDIR /app/owl
92
+
93
+ # 设置适当的权限
94
+ RUN chown -R owl:owl /app
95
+ RUN mkdir -p /root/.cache && chown -R owl:owl /root/.cache
96
+
97
+ # 切换到非root用户
98
+ # 注意:如果需要访问/dev/shm,可能仍需要root用户
99
+ # USER owl
100
+
101
+ # 添加健康检查
102
+ HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
103
+ CMD python -c "import sys; sys.exit(0 if __import__('os').path.exists('/app/owl') else 1)"
104
+
105
+ # 容器启动命令
106
  CMD ["/bin/bash", "-c", "owl-welcome && /bin/bash"]
.container/build_docker.bat CHANGED
@@ -1,22 +1,145 @@
1
  @echo off
 
 
2
  echo 在Windows上构建Docker镜像...
3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  REM 设置Docker BuildKit环境变量
5
  set DOCKER_BUILDKIT=1
6
  set COMPOSE_DOCKER_CLI_BUILD=1
7
 
8
  echo 启用Docker BuildKit加速构建...
9
 
 
 
 
 
 
 
10
  REM 创建缓存目录
11
- if not exist ".docker-cache\pip" mkdir .docker-cache\pip
 
 
 
 
 
 
 
 
 
 
 
 
 
12
 
13
  REM 构建Docker镜像
14
- docker-compose build --build-arg BUILDKIT_INLINE_CACHE=1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
 
16
  if %ERRORLEVEL% EQU 0 (
17
  echo Docker镜像构建成功!
 
18
  echo 可以使用以下命令启动容器:
19
- echo docker-compose up -d
20
  ) else (
21
  echo Docker镜像构建失败,请检查错误信息。
22
  )
 
1
  @echo off
2
+ setlocal enabledelayedexpansion
3
+
4
  echo 在Windows上构建Docker镜像...
5
 
6
+ REM 设置配置变量
7
+ set CACHE_DIR=.docker-cache\pip
8
+ set BUILD_ARGS=--build-arg BUILDKIT_INLINE_CACHE=1
9
+ set COMPOSE_FILE=docker-compose.yml
10
+
11
+ REM 解析命令行参数
12
+ set CLEAN_CACHE=0
13
+ set REBUILD=0
14
+ set SERVICE=
15
+
16
+ :parse_args
17
+ if "%~1"=="" goto :end_parse_args
18
+ if /i "%~1"=="--clean" (
19
+ set CLEAN_CACHE=1
20
+ shift
21
+ goto :parse_args
22
+ )
23
+ if /i "%~1"=="--rebuild" (
24
+ set REBUILD=1
25
+ shift
26
+ goto :parse_args
27
+ )
28
+ if /i "%~1"=="--service" (
29
+ set SERVICE=%~2
30
+ shift
31
+ shift
32
+ goto :parse_args
33
+ )
34
+ if /i "%~1"=="--help" (
35
+ echo 用法: build_docker.bat [选项]
36
+ echo 选项:
37
+ echo --clean 清理缓存目录
38
+ echo --rebuild 强制重新构建镜像
39
+ echo --service 指定要构建的服务名称
40
+ echo --help 显示此帮助信息
41
+ exit /b 0
42
+ )
43
+ shift
44
+ goto :parse_args
45
+ :end_parse_args
46
+
47
+ REM 检查Docker是否安装
48
+ where docker >nul 2>nul
49
+ if %ERRORLEVEL% NEQ 0 (
50
+ echo 错误: Docker未安装
51
+ echo 请先安装Docker Desktop: https://docs.docker.com/desktop/install/windows-install/
52
+ pause
53
+ exit /b 1
54
+ )
55
+
56
+ REM 检查Docker是否运行
57
+ docker info >nul 2>nul
58
+ if %ERRORLEVEL% NEQ 0 (
59
+ echo 错误: Docker未运行
60
+ echo 请启动Docker Desktop应用程序
61
+ pause
62
+ exit /b 1
63
+ )
64
+
65
+ REM 检查docker-compose.yml文件是否存在
66
+ if not exist "%COMPOSE_FILE%" (
67
+ echo 错误: 未找到%COMPOSE_FILE%文件
68
+ echo 请确保在正确的目录中运行此脚本
69
+ pause
70
+ exit /b 1
71
+ )
72
+
73
+ REM 检查Docker Compose命令
74
+ where docker-compose >nul 2>nul
75
+ if %ERRORLEVEL% EQU 0 (
76
+ set COMPOSE_CMD=docker-compose
77
+ ) else (
78
+ echo 尝试使用新的docker compose命令...
79
+ docker compose version >nul 2>nul
80
+ if %ERRORLEVEL% EQU 0 (
81
+ set COMPOSE_CMD=docker compose
82
+ ) else (
83
+ echo 错误: 未找到Docker Compose命令
84
+ echo 请确保Docker Desktop已正确安装
85
+ pause
86
+ exit /b 1
87
+ )
88
+ )
89
+
90
  REM 设置Docker BuildKit环境变量
91
  set DOCKER_BUILDKIT=1
92
  set COMPOSE_DOCKER_CLI_BUILD=1
93
 
94
  echo 启用Docker BuildKit加速构建...
95
 
96
+ REM 清理缓存(如果指定)
97
+ if %CLEAN_CACHE% EQU 1 (
98
+ echo 清理缓存目录...
99
+ if exist "%CACHE_DIR%" rmdir /s /q "%CACHE_DIR%"
100
+ )
101
+
102
  REM 创建缓存目录
103
+ if not exist "%CACHE_DIR%" (
104
+ echo 创建缓存目录...
105
+ mkdir "%CACHE_DIR%"
106
+ )
107
+
108
+ REM 添加构建时间标记
109
+ for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
110
+ set "YEAR=%dt:~0,4%"
111
+ set "MONTH=%dt:~4,2%"
112
+ set "DAY=%dt:~6,2%"
113
+ set "HOUR=%dt:~8,2%"
114
+ set "MINUTE=%dt:~10,2%"
115
+ set "BUILD_TIME=%YEAR%%MONTH%%DAY%_%HOUR%%MINUTE%"
116
+ set "BUILD_ARGS=%BUILD_ARGS% --build-arg BUILD_TIME=%BUILD_TIME%"
117
 
118
  REM 构建Docker镜像
119
+ echo 开始构建Docker镜像...
120
+
121
+ if "%SERVICE%"=="" (
122
+ if %REBUILD% EQU 1 (
123
+ echo 强制重新构建所有服务...
124
+ %COMPOSE_CMD% build --no-cache %BUILD_ARGS%
125
+ ) else (
126
+ %COMPOSE_CMD% build %BUILD_ARGS%
127
+ )
128
+ ) else (
129
+ if %REBUILD% EQU 1 (
130
+ echo 强制重新构建服务 %SERVICE%...
131
+ %COMPOSE_CMD% build --no-cache %BUILD_ARGS% %SERVICE%
132
+ ) else (
133
+ echo 构建服务 %SERVICE%...
134
+ %COMPOSE_CMD% build %BUILD_ARGS% %SERVICE%
135
+ )
136
+ )
137
 
138
  if %ERRORLEVEL% EQU 0 (
139
  echo Docker镜像构建成功!
140
+ echo 构建时间: %BUILD_TIME%
141
  echo 可以使用以下命令启动容器:
142
+ echo %COMPOSE_CMD% up -d
143
  ) else (
144
  echo Docker镜像构建失败,请检查错误信息。
145
  )
.container/build_docker.sh CHANGED
@@ -1,41 +1,150 @@
1
  #!/bin/bash
2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  # 检测操作系统类型
4
  OS_TYPE=$(uname -s)
5
  echo "检测到操作系统: $OS_TYPE"
6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  # 设置Docker BuildKit环境变量
8
  export DOCKER_BUILDKIT=1
9
  export COMPOSE_DOCKER_CLI_BUILD=1
10
 
11
  echo "启用Docker BuildKit加速构建..."
12
 
 
 
 
 
 
 
13
  # 创建缓存目录
14
- mkdir -p .docker-cache/pip
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
 
16
  # 根据操作系统类型执行不同的命令
17
  if [[ "$OS_TYPE" == "Darwin" ]]; then
18
  # macOS
19
  echo "在macOS上构建Docker镜像..."
20
- docker-compose build --build-arg BUILDKIT_INLINE_CACHE=1
21
  elif [[ "$OS_TYPE" == "Linux" ]]; then
22
  # Linux
23
  echo "在Linux上构建Docker镜像..."
24
- docker-compose build --parallel --build-arg BUILDKIT_INLINE_CACHE=1
25
  elif [[ "$OS_TYPE" == MINGW* ]] || [[ "$OS_TYPE" == CYGWIN* ]] || [[ "$OS_TYPE" == MSYS* ]]; then
26
  # Windows
27
  echo "在Windows上构建Docker镜像..."
28
- docker-compose build --build-arg BUILDKIT_INLINE_CACHE=1
29
  else
30
  echo "未知操作系统,尝试使用标准命令构建..."
31
- docker-compose build --build-arg BUILDKIT_INLINE_CACHE=1
32
  fi
33
 
34
  # 检查构建结果
35
  if [ $? -eq 0 ]; then
36
  echo "Docker镜像构建成功!"
 
37
  echo "可以使用以下命令启动容器:"
38
- echo "docker-compose up -d"
39
  else
40
  echo "Docker镜像构建失败,请检查错误信息。"
 
41
  fi
 
1
  #!/bin/bash
2
 
3
+ # 设置配置变量
4
+ CACHE_DIR=".docker-cache/pip"
5
+ BUILD_ARGS="--build-arg BUILDKIT_INLINE_CACHE=1"
6
+ COMPOSE_FILE="docker-compose.yml"
7
+ CLEAN_CACHE=0
8
+ REBUILD=0
9
+ SERVICE=""
10
+
11
+ # 解析命令行参数
12
+ while [[ $# -gt 0 ]]; do
13
+ case "$1" in
14
+ --clean)
15
+ CLEAN_CACHE=1
16
+ shift
17
+ ;;
18
+ --rebuild)
19
+ REBUILD=1
20
+ shift
21
+ ;;
22
+ --service)
23
+ SERVICE="$2"
24
+ shift 2
25
+ ;;
26
+ --help)
27
+ echo "用法: ./build_docker.sh [选项]"
28
+ echo "选项:"
29
+ echo " --clean 清理缓存目录"
30
+ echo " --rebuild 强制重新构建镜像"
31
+ echo " --service 指定要构建的服务名称"
32
+ echo " --help 显示此帮助信息"
33
+ exit 0
34
+ ;;
35
+ *)
36
+ echo "未知选项: $1"
37
+ echo "使用 --help 查看帮助"
38
+ exit 1
39
+ ;;
40
+ esac
41
+ done
42
+
43
  # 检测操作系统类型
44
  OS_TYPE=$(uname -s)
45
  echo "检测到操作系统: $OS_TYPE"
46
 
47
+ # 检查Docker是否安装
48
+ if ! command -v docker &> /dev/null; then
49
+ echo "错误: Docker未安装"
50
+ echo "请先安装Docker: https://docs.docker.com/get-docker/"
51
+ exit 1
52
+ fi
53
+
54
+ # 检查Docker是否运行
55
+ if ! docker info &> /dev/null; then
56
+ echo "错误: Docker未运行"
57
+ echo "请启动Docker服务"
58
+ exit 1
59
+ fi
60
+
61
+ # 检查docker-compose.yml文件是否存在
62
+ if [ ! -f "$COMPOSE_FILE" ]; then
63
+ echo "错误: 未找到$COMPOSE_FILE文件"
64
+ echo "请确保在正确的目录中运行此脚本"
65
+ exit 1
66
+ fi
67
+
68
  # 设置Docker BuildKit环境变量
69
  export DOCKER_BUILDKIT=1
70
  export COMPOSE_DOCKER_CLI_BUILD=1
71
 
72
  echo "启用Docker BuildKit加速构建..."
73
 
74
+ # 清理缓存(如果指定)
75
+ if [ $CLEAN_CACHE -eq 1 ]; then
76
+ echo "清理缓存目录..."
77
+ rm -rf "$CACHE_DIR"
78
+ fi
79
+
80
  # 创建缓存目录
81
+ mkdir -p "$CACHE_DIR"
82
+
83
+ # 添加构建时间标记
84
+ BUILD_TIME=$(date +"%Y%m%d_%H%M%S")
85
+ BUILD_ARGS="$BUILD_ARGS --build-arg BUILD_TIME=$BUILD_TIME"
86
+
87
+ # 获取脚本所在目录
88
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
89
+ # 获取项目根目录(脚本所在目录的父目录)
90
+ PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
91
+
92
+ echo "脚本目录: $SCRIPT_DIR"
93
+ echo "项目根目录: $PROJECT_ROOT"
94
+
95
+ # 切换到项目根目录
96
+ cd "$PROJECT_ROOT"
97
+
98
+ # 检查Docker Compose命令
99
+ if command -v docker-compose &> /dev/null; then
100
+ COMPOSE_CMD="docker-compose"
101
+ echo "使用 docker-compose 命令"
102
+ elif docker compose version &> /dev/null; then
103
+ COMPOSE_CMD="docker compose"
104
+ echo "使用 docker compose 命令"
105
+ else
106
+ echo "错误: 未找到Docker Compose命令"
107
+ echo "请安装Docker Compose: https://docs.docker.com/compose/install/"
108
+ exit 1
109
+ fi
110
+
111
+ # 检测CPU核心数,用于并行构建
112
+ CPU_CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 2)
113
+ if [ $CPU_CORES -gt 2 ]; then
114
+ PARALLEL_FLAG="--parallel"
115
+ echo "检测到${CPU_CORES}个CPU核心,启用并行构建..."
116
+ else
117
+ PARALLEL_FLAG=""
118
+ fi
119
+
120
+ # 构建命令基础部分
121
+ BUILD_CMD="$COMPOSE_CMD -f \"$SCRIPT_DIR/docker-compose.yml\" build $PARALLEL_FLAG --build-arg BUILDKIT_INLINE_CACHE=1"
122
 
123
  # 根据操作系统类型执行不同的命令
124
  if [[ "$OS_TYPE" == "Darwin" ]]; then
125
  # macOS
126
  echo "在macOS上构建Docker镜像..."
127
+ eval $BUILD_CMD
128
  elif [[ "$OS_TYPE" == "Linux" ]]; then
129
  # Linux
130
  echo "在Linux上构建Docker镜像..."
131
+ eval $BUILD_CMD
132
  elif [[ "$OS_TYPE" == MINGW* ]] || [[ "$OS_TYPE" == CYGWIN* ]] || [[ "$OS_TYPE" == MSYS* ]]; then
133
  # Windows
134
  echo "在Windows上构建Docker镜像..."
135
+ eval $BUILD_CMD
136
  else
137
  echo "未知操作系统,尝试使用标准命令构建..."
138
+ eval $BUILD_CMD
139
  fi
140
 
141
  # 检查构建结果
142
  if [ $? -eq 0 ]; then
143
  echo "Docker镜像构建成功!"
144
+ echo "构建时间: $BUILD_TIME"
145
  echo "可以使用以下命令启动容器:"
146
+ echo "$COMPOSE_CMD -f \"$SCRIPT_DIR/docker-compose.yml\" up -d"
147
  else
148
  echo "Docker镜像构建失败,请检查错误信息。"
149
+ exit 1
150
  fi
.container/check_docker.bat CHANGED
@@ -17,7 +17,7 @@ echo Docker已安装
17
  REM 检查Docker Compose是否安装
18
  where docker-compose >nul 2>nul
19
  if %ERRORLEVEL% NEQ 0 (
20
- echo 警告: Docker Compose未找到,尝试使用新的docker compose命令
21
  docker compose version >nul 2>nul
22
  if %ERRORLEVEL% NEQ 0 (
23
  echo 错误: Docker Compose未安装
@@ -27,9 +27,11 @@ if %ERRORLEVEL% NEQ 0 (
27
  exit /b 1
28
  ) else (
29
  echo 使用新的docker compose命令
 
30
  )
31
  ) else (
32
- echo Docker Compose已安装
 
33
  )
34
 
35
  REM 检查Docker是否正在运行
@@ -55,6 +57,6 @@ if not exist "owl\.env" (
55
 
56
  echo 所有检查完成,您的系统已准备好构建和运行OWL项目的Docker容器
57
  echo 请运行以下命令构建Docker镜像:
58
- echo build_docker.bat
59
 
60
  pause
 
17
  REM 检查Docker Compose是否安装
18
  where docker-compose >nul 2>nul
19
  if %ERRORLEVEL% NEQ 0 (
20
+ echo 警告: Docker-Compose未找到,尝试使用新的docker compose命令
21
  docker compose version >nul 2>nul
22
  if %ERRORLEVEL% NEQ 0 (
23
  echo 错误: Docker Compose未安装
 
27
  exit /b 1
28
  ) else (
29
  echo 使用新的docker compose命令
30
+ set COMPOSE_CMD=docker compose
31
  )
32
  ) else (
33
+ echo Docker-Compose已安装
34
+ set COMPOSE_CMD=docker-compose
35
  )
36
 
37
  REM 检查Docker是否正在运行
 
57
 
58
  echo 所有检查完成,您的系统已准备好构建和运行OWL项目的Docker容器
59
  echo 请运行以下命令构建Docker镜像:
60
+ echo %COMPOSE_CMD% build
61
 
62
  pause
.container/docker-compose.yml CHANGED
@@ -1,8 +1,8 @@
1
  services:
2
  owl:
3
  build:
4
- context: .
5
- dockerfile: Dockerfile
6
  args:
7
  # 构建参数
8
  BUILDKIT_INLINE_CACHE: 1
 
1
  services:
2
  owl:
3
  build:
4
+ context: ..
5
+ dockerfile: .container/Dockerfile
6
  args:
7
  # 构建参数
8
  BUILDKIT_INLINE_CACHE: 1
.container/run_in_docker.bat CHANGED
@@ -1,6 +1,12 @@
1
  @echo off
2
  setlocal enabledelayedexpansion
3
 
 
 
 
 
 
 
4
  REM 检查参数
5
  if "%~1"=="" (
6
  echo 用法: run_in_docker.bat [脚本名称] "你的问题"
@@ -37,20 +43,69 @@ if not exist "owl\!SCRIPT_NAME!" (
37
  echo 使用脚本: !SCRIPT_NAME!
38
  echo 查询内容: !QUERY!
39
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  REM 确保Docker容器正在运行
41
- docker-compose ps | findstr "owl.*Up" > nul
42
  if errorlevel 1 (
43
  echo 启动Docker容器...
44
  docker-compose up -d
45
 
46
- REM 等待容器启动
47
  echo 等待容器启动...
48
- timeout /t 5 /nobreak > nul
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
  )
50
 
51
  REM 在容器中运行指定的脚本,传递查询参数
52
- echo 在Docker容器中运行脚本...
53
- docker-compose exec -T owl xvfb-python !SCRIPT_NAME! "!QUERY!"
54
 
55
  if errorlevel 0 (
56
  echo 查询完成!
 
1
  @echo off
2
  setlocal enabledelayedexpansion
3
 
4
+ REM 定义配置变量
5
+ set SERVICE_NAME=owl
6
+ set PYTHON_CMD=xvfb-python
7
+ set MAX_WAIT_SECONDS=60
8
+ set CHECK_INTERVAL_SECONDS=2
9
+
10
  REM 检查参数
11
  if "%~1"=="" (
12
  echo 用法: run_in_docker.bat [脚本名称] "你的问题"
 
43
  echo 使用脚本: !SCRIPT_NAME!
44
  echo 查询内容: !QUERY!
45
 
46
+ REM 从docker-compose.yml获取服务名称(如果文件存在)
47
+ if exist ".container\docker-compose.yml" (
48
+ for /f "tokens=*" %%a in ('findstr /r "^ [a-zA-Z0-9_-]*:" .container\docker-compose.yml') do (
49
+ set line=%%a
50
+ set service=!line:~2,-1!
51
+ if not "!service!"=="" (
52
+ REM 使用第一个找到的服务名称
53
+ set SERVICE_NAME=!service!
54
+ echo 从docker-compose.yml检测到服务名称: !SERVICE_NAME!
55
+ goto :found_service
56
+ )
57
+ )
58
+ )
59
+ :found_service
60
+
61
  REM 确保Docker容器正在运行
62
+ docker-compose ps | findstr "!SERVICE_NAME!.*Up" > nul
63
  if errorlevel 1 (
64
  echo 启动Docker容器...
65
  docker-compose up -d
66
 
67
+ REM 使用循环检查容器是否就绪
68
  echo 等待容器启动...
69
+ set /a total_wait=0
70
+
71
+ :wait_loop
72
+ timeout /t !CHECK_INTERVAL_SECONDS! /nobreak > nul
73
+ set /a total_wait+=!CHECK_INTERVAL_SECONDS!
74
+
75
+ docker-compose ps | findstr "!SERVICE_NAME!.*Up" > nul
76
+ if errorlevel 1 (
77
+ if !total_wait! LSS !MAX_WAIT_SECONDS! (
78
+ echo 容器尚未就绪,已等待!total_wait!秒,继续等待...
79
+ goto :wait_loop
80
+ ) else (
81
+ echo 错误:容器启动超时,已等待!MAX_WAIT_SECONDS!秒
82
+ echo 请检查Docker容器状态:docker-compose ps
83
+ exit /b 1
84
+ )
85
+ ) else (
86
+ echo 容器已就绪,共等待了!total_wait!秒
87
+ )
88
+ )
89
+
90
+ REM 检查容器中是否存在xvfb-python命令
91
+ echo 检查容器中的命令...
92
+ docker-compose exec -T !SERVICE_NAME! which !PYTHON_CMD! > nul 2>&1
93
+ if errorlevel 1 (
94
+ echo 警告:容器中未找到!PYTHON_CMD!命令,尝试使用python替代
95
+ set PYTHON_CMD=python
96
+
97
+ REM 检查python命令是否存在
98
+ docker-compose exec -T !SERVICE_NAME! which python > nul 2>&1
99
+ if errorlevel 1 (
100
+ echo 错误:容器中未找到python命令
101
+ echo 请检查容器配置
102
+ exit /b 1
103
+ )
104
  )
105
 
106
  REM 在容器中运行指定的脚本,传递查询参数
107
+ echo 在Docker容器中使用!PYTHON_CMD!运行脚本...
108
+ docker-compose exec -T !SERVICE_NAME! !PYTHON_CMD! !SCRIPT_NAME! "!QUERY!"
109
 
110
  if errorlevel 0 (
111
  echo 查询完成!
.container/run_in_docker.sh CHANGED
@@ -1,5 +1,11 @@
1
  #!/bin/bash
2
 
 
 
 
 
 
 
3
  # 检测操作系统类型
4
  OS_TYPE=$(uname -s)
5
  echo "检测到操作系统: $OS_TYPE"
@@ -29,53 +35,100 @@ else
29
  QUERY="$1"
30
  fi
31
 
32
- # 根据操作系统类型设置脚本路径检查方式
33
- if [[ "$OS_TYPE" == "Darwin" ]] || [[ "$OS_TYPE" == "Linux" ]]; then
34
- # macOS Linux
35
- if [ ! -f "owl/$SCRIPT_NAME" ]; then
36
- echo "错误: 脚本 'owl/$SCRIPT_NAME' 不存在"
37
- echo "可用的脚本有:"
38
- ls -1 owl/*.py | grep -v "__"
39
- exit 1
40
- fi
41
- else
42
- # Windows
43
- if [ ! -f "owl/$SCRIPT_NAME" ]; then
44
- echo "错误: 脚本 'owl/$SCRIPT_NAME' 不存在"
45
- echo "可用的脚本有:"
46
  find owl -name "*.py" | grep -v "__" | sed 's/\\/\//g'
47
- exit 1
 
48
  fi
 
49
  fi
50
 
51
  echo "使用脚本: $SCRIPT_NAME"
52
  echo "查询内容: $QUERY"
53
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  # 确保Docker容器正在运行
55
- CONTAINER_RUNNING=$(docker-compose ps | grep -c "owl.*Up" || true)
56
  if [ "$CONTAINER_RUNNING" -eq 0 ]; then
57
  echo "启动Docker容器..."
58
- docker-compose up -d
59
 
60
- # 等待容器启动
61
  echo "等待容器启动..."
62
- sleep 5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63
  fi
64
 
65
- # 直接在容器中运行指定的脚本,传递查询参数
66
- echo "在Docker容器中运行脚本..."
67
 
68
  # 根据操作系统类型执行不同的命令
69
  if [[ "$OS_TYPE" == MINGW* ]] || [[ "$OS_TYPE" == CYGWIN* ]] || [[ "$OS_TYPE" == MSYS* ]]; then
70
  # Windows可能需要特殊处理引号
71
- winpty docker-compose exec -T owl xvfb-python $SCRIPT_NAME "$QUERY"
 
72
  else
73
  # macOS 或 Linux
74
- docker-compose exec -T owl xvfb-python $SCRIPT_NAME "$QUERY"
 
75
  fi
76
 
77
  # 检查命令执行结果
78
- if [ $? -eq 0 ]; then
79
  echo "查询完成!"
80
  else
81
  echo "查询执行失败,请检查错误信息。"
 
1
  #!/bin/bash
2
 
3
+ # 定义配置变量
4
+ SERVICE_NAME="owl"
5
+ PYTHON_CMD="xvfb-python"
6
+ MAX_WAIT_SECONDS=60
7
+ CHECK_INTERVAL_SECONDS=2
8
+
9
  # 检测操作系统类型
10
  OS_TYPE=$(uname -s)
11
  echo "检测到操作系统: $OS_TYPE"
 
35
  QUERY="$1"
36
  fi
37
 
38
+ # 检查脚本是否存在
39
+ if [ ! -f "owl/$SCRIPT_NAME" ]; then
40
+ echo "错误: 脚本 'owl/$SCRIPT_NAME' 不存在"
41
+ echo "可用的脚本有:"
42
+ if [[ "$OS_TYPE" == MINGW* ]] || [[ "$OS_TYPE" == CYGWIN* ]] || [[ "$OS_TYPE" == MSYS* ]]; then
 
 
 
 
 
 
 
 
 
43
  find owl -name "*.py" | grep -v "__" | sed 's/\\/\//g'
44
+ else
45
+ ls -1 owl/*.py | grep -v "__"
46
  fi
47
+ exit 1
48
  fi
49
 
50
  echo "使用脚本: $SCRIPT_NAME"
51
  echo "查询内容: $QUERY"
52
 
53
+ # 从docker-compose.yml获取服务名称(如果文件存在)
54
+ if [ -f ".container/docker-compose.yml" ]; then
55
+ DETECTED_SERVICE=$(grep -E "^ [a-zA-Z0-9_-]*:" .container/docker-compose.yml | head -1 | sed 's/^ \(.*\):.*/\1/')
56
+ if [ ! -z "$DETECTED_SERVICE" ]; then
57
+ SERVICE_NAME="$DETECTED_SERVICE"
58
+ echo "从docker-compose.yml检测到服务名称: $SERVICE_NAME"
59
+ fi
60
+ fi
61
+
62
+ # 检查Docker Compose命令
63
+ if command -v docker-compose &> /dev/null; then
64
+ COMPOSE_CMD="docker-compose"
65
+ elif docker compose version &> /dev/null; then
66
+ COMPOSE_CMD="docker compose"
67
+ else
68
+ echo "错误: 未找到Docker Compose命令"
69
+ exit 1
70
+ fi
71
+
72
  # 确保Docker容器正在运行
73
+ CONTAINER_RUNNING=$($COMPOSE_CMD ps | grep -c "$SERVICE_NAME.*Up" || true)
74
  if [ "$CONTAINER_RUNNING" -eq 0 ]; then
75
  echo "启动Docker容器..."
76
+ $COMPOSE_CMD up -d
77
 
78
+ # 使用循环检查容器是否就绪
79
  echo "等待容器启动..."
80
+ TOTAL_WAIT=0
81
+
82
+ while [ $TOTAL_WAIT -lt $MAX_WAIT_SECONDS ]; do
83
+ sleep $CHECK_INTERVAL_SECONDS
84
+ TOTAL_WAIT=$((TOTAL_WAIT + CHECK_INTERVAL_SECONDS))
85
+
86
+ CONTAINER_RUNNING=$($COMPOSE_CMD ps | grep -c "$SERVICE_NAME.*Up" || true)
87
+ if [ "$CONTAINER_RUNNING" -gt 0 ]; then
88
+ echo "容器已就绪,共等待了 $TOTAL_WAIT 秒"
89
+ break
90
+ else
91
+ echo "容器尚未就绪,已等待 $TOTAL_WAIT 秒,继续等待..."
92
+ fi
93
+ done
94
+
95
+ if [ "$CONTAINER_RUNNING" -eq 0 ]; then
96
+ echo "错误:容器启动超时,已等待 $MAX_WAIT_SECONDS 秒"
97
+ echo "请检查Docker容器状态:$COMPOSE_CMD ps"
98
+ exit 1
99
+ fi
100
+ fi
101
+
102
+ # 检查容器中是否存在指定的Python命令
103
+ echo "检查容器中的命令..."
104
+ if ! $COMPOSE_CMD exec -T $SERVICE_NAME which $PYTHON_CMD &> /dev/null; then
105
+ echo "警告:容器中未找到 $PYTHON_CMD 命令,尝试使用python替代"
106
+ PYTHON_CMD="python"
107
+
108
+ # 检查python命令是否存在
109
+ if ! $COMPOSE_CMD exec -T $SERVICE_NAME which python &> /dev/null; then
110
+ echo "错误:容器中未找到python命令"
111
+ echo "请检查容器配置"
112
+ exit 1
113
+ fi
114
  fi
115
 
116
+ # 在容器中运行指定的脚本,传递查询参数
117
+ echo "在Docker容器中使用 $PYTHON_CMD 运行脚本..."
118
 
119
  # 根据操作系统类型执行不同的命令
120
  if [[ "$OS_TYPE" == MINGW* ]] || [[ "$OS_TYPE" == CYGWIN* ]] || [[ "$OS_TYPE" == MSYS* ]]; then
121
  # Windows可能需要特殊处理引号
122
+ winpty $COMPOSE_CMD exec -T $SERVICE_NAME $PYTHON_CMD $SCRIPT_NAME "$QUERY"
123
+ RESULT=$?
124
  else
125
  # macOS 或 Linux
126
+ $COMPOSE_CMD exec -T $SERVICE_NAME $PYTHON_CMD $SCRIPT_NAME "$QUERY"
127
+ RESULT=$?
128
  fi
129
 
130
  # 检查命令执行结果
131
+ if [ $RESULT -eq 0 ]; then
132
  echo "查询完成!"
133
  else
134
  echo "查询执行失败,请检查错误信息。"