File size: 4,302 Bytes
1d6bdab
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
#!/bin/bash

# 定义配置变量
SERVICE_NAME="owl"
PYTHON_CMD="xvfb-python"
MAX_WAIT_SECONDS=60
CHECK_INTERVAL_SECONDS=2

# 检测操作系统类型
OS_TYPE=$(uname -s)
echo "检测到操作系统: $OS_TYPE"

# 检查是否提供了查询参数
if [ $# -lt 1 ]; then
    echo "用法: ./run_in_docker.sh [脚本名称] '你的问题'"
    echo "例如: ./run_in_docker.sh run.py '什么是人工智能?'"
    echo "或者: ./run_in_docker.sh run_deepseek_example.py '什么是人工智能?'"
    echo "如果不指定脚本名称,默认使用 run.py"
    exit 1
fi

# 判断第一个参数是否是脚本名称
if [[ $1 == *.py ]]; then
    SCRIPT_NAME="$1"
    # 如果提供了第二个参数,则为查询内容
    if [ $# -ge 2 ]; then
        QUERY="$2"
    else
        echo "请提供查询参数,例如: ./run_in_docker.sh $SCRIPT_NAME '你的问题'"
        exit 1
    fi
else
    # 如果第一个参数不是脚本名称,则默认使用 run.py
    SCRIPT_NAME="run.py"
    QUERY="$1"
fi

# 检查脚本是否存在
if [ ! -f "owl/$SCRIPT_NAME" ]; then
    echo "错误: 脚本 'owl/$SCRIPT_NAME' 不存在"
    echo "可用的脚本有:"
    if [[ "$OS_TYPE" == MINGW* ]] || [[ "$OS_TYPE" == CYGWIN* ]] || [[ "$OS_TYPE" == MSYS* ]]; then
        find owl -name "*.py" | grep -v "__" | sed 's/\\/\//g'
    else
        ls -1 owl/*.py | grep -v "__"
    fi
    exit 1
fi

echo "使用脚本: $SCRIPT_NAME"
echo "查询内容: $QUERY"

# 从docker-compose.yml获取服务名称(如果文件存在)
if [ -f ".container/docker-compose.yml" ]; then
    DETECTED_SERVICE=$(grep -E "^  [a-zA-Z0-9_-]*:" .container/docker-compose.yml | head -1 | sed 's/^  \(.*\):.*/\1/')
    if [ ! -z "$DETECTED_SERVICE" ]; then
        SERVICE_NAME="$DETECTED_SERVICE"
        echo "从docker-compose.yml检测到服务名称: $SERVICE_NAME"
    fi
fi

# 检查Docker Compose命令
if command -v docker-compose &> /dev/null; then
    COMPOSE_CMD="docker-compose"
elif docker compose version &> /dev/null; then
    COMPOSE_CMD="docker compose"
else
    echo "错误: 未找到Docker Compose命令"
    exit 1
fi

# 确保Docker容器正在运行
CONTAINER_RUNNING=$($COMPOSE_CMD ps | grep -c "$SERVICE_NAME.*Up" || true)
if [ "$CONTAINER_RUNNING" -eq 0 ]; then
    echo "启动Docker容器..."
    $COMPOSE_CMD up -d
    
    # 使用循环检查容器是否就绪
    echo "等待容器启动..."
    TOTAL_WAIT=0
    
    while [ $TOTAL_WAIT -lt $MAX_WAIT_SECONDS ]; do
        sleep $CHECK_INTERVAL_SECONDS
        TOTAL_WAIT=$((TOTAL_WAIT + CHECK_INTERVAL_SECONDS))
        
        CONTAINER_RUNNING=$($COMPOSE_CMD ps | grep -c "$SERVICE_NAME.*Up" || true)
        if [ "$CONTAINER_RUNNING" -gt 0 ]; then
            echo "容器已就绪,共等待了 $TOTAL_WAIT 秒"
            break
        else
            echo "容器尚未就绪,已等待 $TOTAL_WAIT 秒,继续等待..."
        fi
    done
    
    if [ "$CONTAINER_RUNNING" -eq 0 ]; then
        echo "错误:容器启动超时,已等待 $MAX_WAIT_SECONDS 秒"
        echo "请检查Docker容器状态:$COMPOSE_CMD ps"
        exit 1
    fi
fi

# 检查容器中是否存在指定的Python命令
echo "检查容器中的命令..."
if ! $COMPOSE_CMD exec -T $SERVICE_NAME which $PYTHON_CMD &> /dev/null; then
    echo "警告:容器中未找到 $PYTHON_CMD 命令,尝试使用python替代"
    PYTHON_CMD="python"
    
    # 检查python命令是否存在
    if ! $COMPOSE_CMD exec -T $SERVICE_NAME which python &> /dev/null; then
        echo "错误:容器中未找到python命令"
        echo "请检查容器配置"
        exit 1
    fi
fi

# 在容器中运行指定的脚本,传递查询参数
echo "在Docker容器中使用 $PYTHON_CMD 运行脚本..."

# 根据操作系统类型执行不同的命令
if [[ "$OS_TYPE" == MINGW* ]] || [[ "$OS_TYPE" == CYGWIN* ]] || [[ "$OS_TYPE" == MSYS* ]]; then
    # Windows可能需要特殊处理引号
    winpty $COMPOSE_CMD exec -T $SERVICE_NAME $PYTHON_CMD $SCRIPT_NAME "$QUERY"
    RESULT=$?
else
    # macOS 或 Linux
    $COMPOSE_CMD exec -T $SERVICE_NAME $PYTHON_CMD $SCRIPT_NAME "$QUERY"
    RESULT=$?
fi

# 检查命令执行结果
if [ $RESULT -eq 0 ]; then
    echo "查询完成!"
else
    echo "查询执行失败,请检查错误信息。"
fi