
















@@ -19,7 +19,7 @@ docker_build_on_missing_enabled() {
1919 [ "${OPENCLAW_TESTBOX:-0}" = "1" ]
2020}
212122-docker_build_exec() {
22+docker_build_command() {
2323local build_cmd=(docker build)
2424if [ "${OPENCLAW_DOCKER_BUILD_USE_BUILDX:-0}" = "1" ]; then
2525 build_cmd=(docker buildx build --load)
@@ -31,23 +31,66 @@ docker_build_exec() {
3131fi
3232fi
333334- env DOCKER_BUILDKIT=1 "${build_cmd[@]}" "$@"
34+printf '%s\0' env DOCKER_BUILDKIT=1 "${build_cmd[@]}" "$@"
3535}
363637-docker_build_run() {
37+docker_build_transient_failure() {
38+local log_file="$1"
39+ grep -Eqi \
40+'frontend grpc server closed unexpectedly|failed to dial gRPC|no active session|buildkit.*connection.*closed|rpc error: code = Unavailable' \
41+"$log_file"
42+}
43+44+docker_build_retry_count() {
45+local configured="${OPENCLAW_DOCKER_BUILD_RETRIES:-2}"
46+if [[ "$configured" =~ ^[0-9]+$ ]]; then
47+echo "$configured"
48+return 0
49+fi
50+echo 2
51+}
52+53+docker_build_with_retries() {
3854local label="$1"
3955shift
56+local retries
57+ retries="$(docker_build_retry_count)"
58+local attempt=1
59+local max_attempts=$((retries + 1))
60+local log_file
61+local command=()
62+while IFS= read -r -d '' part; do
63+ command+=("$part")
64+done < <(docker_build_command "$@")
406541-local build_cmd=(docker build)
42-if [ "${OPENCLAW_DOCKER_BUILD_USE_BUILDX:-0}" = "1" ]; then
43-build_cmd=(docker buildx build --load)
44-if [ -n "${OPENCLAW_DOCKER_BUILD_CACHE_FROM:-}" ]; then
45-build_cmd+=(--cache-from "${OPENCLAW_DOCKER_BUILD_CACHE_FROM}")
66+while true; do
67+ log_file="$(docker_e2e_run_log "$label")"
68+if "${command[@]}" >"$log_file" 2>&1; then
69+ rm -f "$log_file"
70+return 0
4671fi
47-if [ -n "${OPENCLAW_DOCKER_BUILD_CACHE_TO:-}" ]; then
48- build_cmd+=(--cache-to "${OPENCLAW_DOCKER_BUILD_CACHE_TO}")
72+73+if [ "$attempt" -ge "$max_attempts" ] || ! docker_build_transient_failure "$log_file"; then
74+ docker_e2e_print_log "$log_file"
75+ rm -f "$log_file"
76+return 1
4977fi
50-fi
517852- run_logged "$label" env DOCKER_BUILDKIT=1 "${build_cmd[@]}" "$@"
79+echo "Docker build failed with a transient BuildKit transport error; retrying ($attempt/$retries)..." >&2
80+ docker_e2e_print_log "$log_file"
81+ rm -f "$log_file"
82+ attempt=$((attempt + 1))
83+ sleep "$attempt"
84+done
85+}
86+87+docker_build_exec() {
88+ docker_build_with_retries docker-build "$@"
89+}
90+91+docker_build_run() {
92+local label="$1"
93+shift
94+95+ docker_build_with_retries "$label" "$@"
5396}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。