Spaces:
Configuration error
Configuration error
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 |