File size: 6,318 Bytes
5d9f8de d02f3a5 92a1202 d02f3a5 5d9f8de d02f3a5 5d9f8de d02f3a5 5d9f8de d02f3a5 5d9f8de d02f3a5 5d9f8de d02f3a5 5d9f8de d02f3a5 5d9f8de d02f3a5 5d9f8de d02f3a5 c42752c d02f3a5 92a1202 c42752c 92a1202 c42752c 5d9f8de 92a1202 5d9f8de d02f3a5 5d9f8de d02f3a5 c42752c 92a1202 d02f3a5 92a1202 d02f3a5 92a1202 d02f3a5 92a1202 d02f3a5 92a1202 5d9f8de d02f3a5 92a1202 5d9f8de d02f3a5 92a1202 d02f3a5 92a1202 d02f3a5 92a1202 d02f3a5 92a1202 d02f3a5 92a1202 d02f3a5 92a1202 d02f3a5 92a1202 d02f3a5 92a1202 5d9f8de d02f3a5 5d9f8de d02f3a5 5d9f8de d02f3a5 c42752c 92a1202 5d9f8de d02f3a5 c42752c 92a1202 5d9f8de d02f3a5 92a1202 d02f3a5 5d9f8de d02f3a5 |
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
# 定义配置变量 | Define configuration variables
SERVICE_NAME="owl"
PYTHON_CMD="xvfb-python"
MAX_WAIT_SECONDS=60
CHECK_INTERVAL_SECONDS=2
# 检测操作系统类型 | Detect operating system type
OS_TYPE=$(uname -s)
echo "检测到操作系统 | Detected operating system: $OS_TYPE"
# 检查是否提供了查询参数 | Check if query parameters are provided
if [ $# -lt 1 ]; then
echo "用法 | Usage: ./run_in_docker.sh [脚本名称 | script name] '你的问题 | your question'"
echo "例如 | Example: ./run_in_docker.sh run.py '什么是人工智能? | What is artificial intelligence?'"
echo "或者 | Or: ./run_in_docker.sh run_deepseek_example.py '什么是人工智能? | What is artificial intelligence?'"
echo "如果不指定脚本名称,默认使用 run.py | If script name is not specified, run.py will be used by default"
exit 1
fi
# 判断第一个参数是否是脚本名称 | Determine if the first parameter is a script name
if [[ $1 == *.py ]]; then
SCRIPT_NAME="$1"
# 如果提供了第二个参数,则为查询内容 | If a second parameter is provided, it's the query content
if [ $# -ge 2 ]; then
QUERY="$2"
else
echo "请提供查询参数,例如 | Please provide query parameter, e.g.: ./run_in_docker.sh $SCRIPT_NAME '你的问题 | your question'"
exit 1
fi
else
# 如果第一个参数不是脚本名称,则默认使用 run.py | If the first parameter is not a script name, use run.py by default
SCRIPT_NAME="run.py"
QUERY="$1"
fi
# 检查脚本是否存在 | Check if the script exists
if [ ! -f "../owl/$SCRIPT_NAME" ]; then
echo "错误 | Error: 脚本 | Script '../owl/$SCRIPT_NAME' 不存在 | does not exist"
echo "可用的脚本有 | Available scripts:"
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 "使用脚本 | Using script: $SCRIPT_NAME"
echo "查询内容 | Query content: $QUERY"
# 从docker-compose.yml获取服务名称(如果文件存在) | Get service name from docker-compose.yml (if file exists)
if [ -f "docker-compose.yml" ]; then
DETECTED_SERVICE=$(grep -E "^ [a-zA-Z0-9_-]*:" docker-compose.yml | head -1 | sed 's/^ \(.*\):.*/\1/')
if [ ! -z "$DETECTED_SERVICE" ]; then
SERVICE_NAME="$DETECTED_SERVICE"
echo "从docker-compose.yml检测到服务名称 | Detected service name from docker-compose.yml: $SERVICE_NAME"
fi
fi
# 检查Docker Compose命令 | Check Docker Compose command
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 "错误 | Error: 未找到Docker Compose命令 | Docker Compose command not found"
exit 1
fi
# 确保Docker容器正在运行 | Ensure Docker container is running
CONTAINER_RUNNING=$($COMPOSE_CMD ps | grep -c "$SERVICE_NAME.*Up" || true)
if [ "$CONTAINER_RUNNING" -eq 0 ]; then
echo "启动Docker容器... | Starting Docker container..."
$COMPOSE_CMD up -d
# 使用循环检查容器是否就绪 | Use loop to check if container is ready
echo "等待容器启动... | Waiting for container to start..."
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 秒 | Container is ready, waited for $TOTAL_WAIT seconds in total"
break
else
echo "容器尚未就绪,已等待 $TOTAL_WAIT 秒,继续等待... | Container not ready yet, waited for $TOTAL_WAIT seconds, continuing to wait..."
fi
done
if [ "$CONTAINER_RUNNING" -eq 0 ]; then
echo "错误 | Error:容器启动超时,已等待 $MAX_WAIT_SECONDS 秒 | Container startup timeout, waited for $MAX_WAIT_SECONDS seconds"
echo "请检查Docker容器状态 | Please check Docker container status:$COMPOSE_CMD ps"
exit 1
fi
fi
# 检查容器中是否存在指定的Python命令 | Check if specified Python command exists in container
echo "检查容器中的命令... | Checking commands in container..."
if ! $COMPOSE_CMD exec -T $SERVICE_NAME which $PYTHON_CMD &> /dev/null; then
echo "警告 | Warning:容器中未找到 $PYTHON_CMD 命令,尝试使用python替代 | $PYTHON_CMD command not found in container, trying to use python instead"
PYTHON_CMD="python"
# 检查python命令是否存在 | Check if python command exists
if ! $COMPOSE_CMD exec -T $SERVICE_NAME which python &> /dev/null; then
echo "错误 | Error:容器中未找到python命令 | python command not found in container"
echo "请检查容器配置 | Please check container configuration"
exit 1
fi
fi
# 在容器中运行指定的脚本,传递查询参数 | Run the specified script in container, passing query parameter
echo "在Docker容器中使用 $PYTHON_CMD 运行脚本... | Running script in Docker container using $PYTHON_CMD..."
# 根据操作系统类型执行不同的命令 | Execute different commands based on operating system type
if [[ "$OS_TYPE" == MINGW* ]] || [[ "$OS_TYPE" == CYGWIN* ]] || [[ "$OS_TYPE" == MSYS* ]]; then
# Windows可能需要特殊处理引号 | Windows may need special handling for quotes
winpty $COMPOSE_CMD exec -T $SERVICE_NAME bash -c "cd .. && source .venv/bin/activate && cd owl && $PYTHON_CMD $SCRIPT_NAME \"$QUERY\""
RESULT=$?
else
# macOS 或 Linux | macOS or Linux
$COMPOSE_CMD exec -T $SERVICE_NAME bash -c "cd .. && source .venv/bin/activate && cd owl && $PYTHON_CMD $SCRIPT_NAME \"$QUERY\""
RESULT=$?
fi
# 检查命令执行结果 | Check command execution result
if [ $RESULT -eq 0 ]; then
echo "查询完成! | Query completed!"
else
echo "查询执行失败,请检查错误信息。 | Query execution failed, please check error messages."
fi |