-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrun-docker.sh
More file actions
executable file
·139 lines (112 loc) · 3.45 KB
/
run-docker.sh
File metadata and controls
executable file
·139 lines (112 loc) · 3.45 KB
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
136
137
138
139
#!/bin/bash
set -euo pipefail
IMAGE_REPO="github_argus"
CONFIG_FILE="config.json"
sanitize_tag() {
local raw_tag="$1"
local normalized_tag
normalized_tag=$(echo "$raw_tag" | tr '[:upper:]' '[:lower:]' | sed 's#[^a-z0-9_.-]#-#g' | sed 's#^[.-]*##' | sed 's#[-.]*$##')
if [ -z "$normalized_tag" ]; then
normalized_tag="latest"
fi
echo "$normalized_tag"
}
append_env_var() {
local env_name="$1"
local required="$2"
if [ -n "${!env_name:-}" ]; then
ENV_VARS+=("-e" "$env_name=${!env_name}")
echo "$env_name 已从当前环境变量中获取"
return
fi
if [ "$required" = "true" ]; then
read -r -p "请输入 $env_name 的值: " value
if [ -z "$value" ]; then
echo "错误:$env_name 不能为空"
exit 1
fi
ENV_VARS+=("-e" "$env_name=$value")
return
fi
read -r -p "是否设置 $env_name? (y/n,默认n): " set_env
if [ "$set_env" = "y" ] || [ "$set_env" = "Y" ]; then
read -r -p "请输入 $env_name 的值: " value
ENV_VARS+=("-e" "$env_name=$value")
fi
}
if ! docker info >/dev/null 2>&1; then
echo "错误:Docker服务未运行,请先启动Docker"
exit 1
fi
# 默认标签策略与构建脚本保持一致:优先参数,其次当前分支,最后latest
if [ -n "${1:-}" ]; then
RAW_TAG="$1"
else
if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
RAW_TAG=$(git rev-parse --abbrev-ref HEAD)
if [ "$RAW_TAG" = "HEAD" ]; then
RAW_TAG="detached-$(git rev-parse --short HEAD)"
fi
else
RAW_TAG="latest"
fi
fi
TAG=$(sanitize_tag "$RAW_TAG")
IMAGE_TAG="$IMAGE_REPO:$TAG"
if [ "$RAW_TAG" != "$TAG" ]; then
echo "提示:检测到标签包含特殊字符,已自动规范化: $RAW_TAG -> $TAG"
fi
echo "将使用镜像: $IMAGE_TAG"
if ! docker image inspect "$IMAGE_TAG" >/dev/null 2>&1; then
echo "错误:镜像不存在:$IMAGE_TAG"
echo "请先执行构建:./build-docker.sh ${TAG}"
exit 1
fi
if [ ! -f "$CONFIG_FILE" ]; then
echo "错误:未找到 $CONFIG_FILE,无法判断 model_type"
exit 1
fi
MODEL_TYPE=$(awk -F'"' '/"model_type"[[:space:]]*:/ {print tolower($4); exit}' "$CONFIG_FILE")
if [ -z "$MODEL_TYPE" ]; then
echo "错误:config.json 中 llm.model_type 未配置"
exit 1
fi
echo "检测到 model_type: $MODEL_TYPE"
# 必需变量:GITHUB_TOKEN 为全局必需
REQUIRED_ENVS=("GITHUB_TOKEN")
# 根据 model_type 追加必需变量
case "$MODEL_TYPE" in
openai)
REQUIRED_ENVS+=("LLM_API_TOKEN" "LLM_BASE_URL")
;;
ollama)
;;
*)
echo "错误:不支持的 model_type: $MODEL_TYPE"
exit 1
;;
esac
# 可选变量
OPTIONAL_ENVS=(
"GMAIL_SPECIAL_PASSWORD"
"EMAIL_SMTP_SERVER"
"EMAIL_SMTP_PORT"
"EMAIL_FROM"
"EMAIL_TO"
"WX_WEBHOOK_URL"
)
# 存储环境变量的数组
ENV_VARS=()
echo -e "\n准备运行 $IMAGE_TAG 镜像..."
echo "----------------------------------------"
for env in "${REQUIRED_ENVS[@]}"; do
append_env_var "$env" "true"
done
echo -e "\n是否需要设置可选环境变量?"
for env in "${OPTIONAL_ENVS[@]}"; do
append_env_var "$env" "false"
done
echo -e "\n即将执行以下命令:"
echo "docker run -it --rm --add-host=host.docker.internal:host-gateway $IMAGE_TAG"
echo -e "\n启动容器..."
docker run -it --rm --add-host=host.docker.internal:host-gateway "${ENV_VARS[@]}" "$IMAGE_TAG"