



















@@ -19,6 +19,12 @@ ADMIN_PASSWORD="${OPENCLAW_OPENWEBUI_ADMIN_PASSWORD:-OpenWebUI-E2E-Password-$(da
1919NET_NAME="openclaw-openwebui-e2e-$$"
2020GW_NAME="openclaw-openwebui-gateway-$$"
2121OW_NAME="openclaw-openwebui-$$"
22+DOCKER_COMMAND_TIMEOUT="${OPENCLAW_OPENWEBUI_DOCKER_COMMAND_TIMEOUT:-60s}"
23+DOCKER_PULL_TIMEOUT="${OPENCLAW_OPENWEBUI_DOCKER_PULL_TIMEOUT:-300s}"
24+25+docker_cmd() {
26+ timeout "$DOCKER_COMMAND_TIMEOUT" "$@"
27+}
22282329OPENAI_API_KEY_VALUE="${OPENAI_API_KEY:-}"
2430if [[ "$OPENAI_API_KEY_VALUE" == "undefined" || "$OPENAI_API_KEY_VALUE" == "null" ]]; then
@@ -34,22 +40,22 @@ if [[ -z "$OPENAI_API_KEY_VALUE" ]]; then
3440fi
35413642cleanup() {
37- docker rm -f "$OW_NAME" >/dev/null 2>&1 || true
38- docker rm -f "$GW_NAME" >/dev/null 2>&1 || true
39- docker network rm "$NET_NAME" >/dev/null 2>&1 || true
43+docker_cmd docker rm -f "$OW_NAME" >/dev/null 2>&1 || true
44+docker_cmd docker rm -f "$GW_NAME" >/dev/null 2>&1 || true
45+docker_cmd docker network rm "$NET_NAME" >/dev/null 2>&1 || true
4046}
4147trap cleanup EXIT
42484349docker_e2e_build_or_reuse "$IMAGE_NAME" openwebui
44504551echo "Pulling Open WebUI image: $OPENWEBUI_IMAGE"
46-docker pull "$OPENWEBUI_IMAGE" >/dev/null
52+timeout "$DOCKER_PULL_TIMEOUT" docker pull "$OPENWEBUI_IMAGE" >/dev/null
47534854echo "Creating Docker network..."
49-docker network create "$NET_NAME" >/dev/null
55+docker_cmd docker network create "$NET_NAME" >/dev/null
50565157echo "Starting gateway container..."
52-docker run -d \
58+docker_cmd docker run -d \
5359 --name "$GW_NAME" \
5460 --network "$NET_NAME" \
5561 -e "OPENCLAW_GATEWAY_TOKEN=$TOKEN" \
@@ -115,10 +121,10 @@ EOF
115121echo "Waiting for gateway HTTP surface..."
116122gateway_ready=0
117123for _ in $(seq 1 240); do
118-if [ "$(docker inspect -f '{{.State.Running}}' "$GW_NAME" 2>/dev/null || echo false)" != "true" ]; then
124+if [ "$(docker_cmd docker inspect -f '{{.State.Running}}' "$GW_NAME" 2>/dev/null || echo false)" != "true" ]; then
119125break
120126fi
121-if docker exec "$GW_NAME" bash -lc "node --input-type=module -e '
127+if docker_cmd docker exec "$GW_NAME" bash -lc "node --input-type=module -e '
122128 const res = await fetch(\"http://127.0.0.1:$PORT/v1/models\", {
123129 headers: { authorization: \"Bearer $TOKEN\" },
124130 }).catch(() => null);
@@ -132,16 +138,16 @@ done
132138133139if [ "$gateway_ready" -ne 1 ]; then
134140echo "Gateway failed to start"
135- docker inspect "$GW_NAME" --format '{{json .State}}' 2>/dev/null || true
136-if [ "$(docker inspect -f '{{.State.Running}}' "$GW_NAME" 2>/dev/null || echo false)" = "true" ]; then
137- docker exec "$GW_NAME" bash -lc 'tail -n 200 /tmp/openwebui-gateway.log' || true
141+docker_cmd docker inspect "$GW_NAME" --format '{{json .State}}' 2>/dev/null || true
142+if [ "$(docker_cmd docker inspect -f '{{.State.Running}}' "$GW_NAME" 2>/dev/null || echo false)" = "true" ]; then
143+docker_cmd docker exec "$GW_NAME" bash -lc 'tail -n 200 /tmp/openwebui-gateway.log' || true
138144fi
139- docker logs "$GW_NAME" 2>&1 | tail -n 200 || true
145+docker_cmd docker logs "$GW_NAME" 2>&1 | tail -n 200 || true
140146exit 1
141147fi
142148143149echo "Starting Open WebUI container..."
144-docker run -d \
150+docker_cmd docker run -d \
145151 --name "$OW_NAME" \
146152 --network "$NET_NAME" \
147153 -e ENV=prod \
@@ -167,10 +173,10 @@ docker run -d \
167173echo "Waiting for Open WebUI..."
168174ow_ready=0
169175for _ in $(seq 1 240); do
170-if [ "$(docker inspect -f '{{.State.Running}}' "$OW_NAME" 2>/dev/null || echo false)" != "true" ]; then
176+if [ "$(docker_cmd docker inspect -f '{{.State.Running}}' "$OW_NAME" 2>/dev/null || echo false)" != "true" ]; then
171177break
172178fi
173-if docker exec "$GW_NAME" bash -lc "node --input-type=module -e '
179+if docker_cmd docker exec "$GW_NAME" bash -lc "node --input-type=module -e '
174180 const res = await fetch(\"http://$OW_NAME:$WEBUI_PORT/\").catch(() => null);
175181 process.exit(res && res.status < 500 ? 0 : 1);
176182 ' >/dev/null 2>&1"; then
@@ -182,17 +188,17 @@ done
182188183189if [ "$ow_ready" -ne 1 ]; then
184190echo "Open WebUI failed to start"
185- docker logs "$OW_NAME" 2>&1 | tail -n 200 || true
191+docker_cmd docker logs "$OW_NAME" 2>&1 | tail -n 200 || true
186192exit 1
187193fi
188194189195echo "Waiting for gateway model endpoint after Open WebUI startup..."
190196gateway_model_ready=0
191197for _ in $(seq 1 90); do
192-if [ "$(docker inspect -f '{{.State.Running}}' "$GW_NAME" 2>/dev/null || echo false)" != "true" ]; then
198+if [ "$(docker_cmd docker inspect -f '{{.State.Running}}' "$GW_NAME" 2>/dev/null || echo false)" != "true" ]; then
193199break
194200fi
195-if docker exec "$GW_NAME" bash -lc "node --input-type=module -e '
201+if docker_cmd docker exec "$GW_NAME" bash -lc "node --input-type=module -e '
196202 const controller = new AbortController();
197203 const timeout = setTimeout(() => controller.abort(), 8000);
198204 try {
@@ -215,17 +221,17 @@ done
215221216222if [ "$gateway_model_ready" -ne 1 ]; then
217223echo "Gateway model endpoint did not stay reachable after Open WebUI startup"
218- docker inspect "$GW_NAME" --format '{{json .State}}' 2>/dev/null || true
219-if [ "$(docker inspect -f '{{.State.Running}}' "$GW_NAME" 2>/dev/null || echo false)" = "true" ]; then
220- docker exec "$GW_NAME" bash -lc 'tail -n 200 /tmp/openwebui-gateway.log' || true
224+docker_cmd docker inspect "$GW_NAME" --format '{{json .State}}' 2>/dev/null || true
225+if [ "$(docker_cmd docker inspect -f '{{.State.Running}}' "$GW_NAME" 2>/dev/null || echo false)" = "true" ]; then
226+docker_cmd docker exec "$GW_NAME" bash -lc 'tail -n 200 /tmp/openwebui-gateway.log' || true
221227fi
222- docker logs "$GW_NAME" 2>&1 | tail -n 200 || true
223- docker logs "$OW_NAME" 2>&1 | tail -n 200 || true
228+docker_cmd docker logs "$GW_NAME" 2>&1 | tail -n 200 || true
229+docker_cmd docker logs "$OW_NAME" 2>&1 | tail -n 200 || true
224230exit 1
225231fi
226232227233echo "Running Open WebUI -> OpenClaw smoke..."
228-if ! docker exec \
234+if ! docker_cmd docker exec \
229235 -e "OPENWEBUI_BASE_URL=http://$OW_NAME:$WEBUI_PORT" \
230236 -e "OPENWEBUI_ADMIN_EMAIL=$ADMIN_EMAIL" \
231237 -e "OPENWEBUI_ADMIN_PASSWORD=$ADMIN_PASSWORD" \
@@ -237,13 +243,13 @@ if ! docker exec \
237243 node /app/scripts/e2e/openwebui-probe.mjs >/tmp/openwebui-probe.log 2>&1; then
238244 cat /tmp/openwebui-probe.log 2>/dev/null || true
239245echo "Open WebUI probe failed; gateway log tail:"
240- docker inspect "$GW_NAME" --format '{{json .State}}' 2>/dev/null || true
241-if [ "$(docker inspect -f '{{.State.Running}}' "$GW_NAME" 2>/dev/null || echo false)" = "true" ]; then
242- docker exec "$GW_NAME" bash -lc 'tail -n 200 /tmp/openwebui-gateway.log' || true
246+docker_cmd docker inspect "$GW_NAME" --format '{{json .State}}' 2>/dev/null || true
247+if [ "$(docker_cmd docker inspect -f '{{.State.Running}}' "$GW_NAME" 2>/dev/null || echo false)" = "true" ]; then
248+docker_cmd docker exec "$GW_NAME" bash -lc 'tail -n 200 /tmp/openwebui-gateway.log' || true
243249fi
244- docker logs "$GW_NAME" 2>&1 | tail -n 200 || true
250+docker_cmd docker logs "$GW_NAME" 2>&1 | tail -n 200 || true
245251echo "Open WebUI container logs:"
246- docker logs "$OW_NAME" 2>&1 | tail -n 200 || true
252+docker_cmd docker logs "$OW_NAME" 2>&1 | tail -n 200 || true
247253exit 1
248254fi
249255此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。