From ac9bd9189761467ee646f42912c2e203ccbe3815 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Tue, 18 Aug 2026 18:27:05 +0800 Subject: [PATCH] fix: remove buildx registry cache from docker_build_push.sh to fix Worker Base Image build - Replace buildx build + registry cache with plain docker build + docker push - Fixes RPC crash (rpc error: code = Unavailable desc = closing transport) during cache export to registry - Fixes 'No such image' error: docker buildx --push doesn't load image to local daemon, causing subsequent docker tag to fail - Maintains backward compatibility: script still accepts cache_ref param Fixes #1421 --- scripts/ci/docker_build_push.sh | 105 ++++++-------------------------- 1 file changed, 17 insertions(+), 88 deletions(-) diff --git a/scripts/ci/docker_build_push.sh b/scripts/ci/docker_build_push.sh index bff4325ca..f9dd65f96 100755 --- a/scripts/ci/docker_build_push.sh +++ b/scripts/ci/docker_build_push.sh @@ -1,9 +1,9 @@ #!/bin/bash -# 通用Docker镜像构建+推送脚本(local cache为主 + registry cache共享) +# 通用Docker镜像构建+推送脚本(普通 docker build + docker push) # 用法: docker_build_push.sh [--no-cache] [build_arg...] +# 注: cache_ref 参数保留兼容性但不再使用(已移除 registry cache) set -eu -# 单次 build 超时时间(秒),防止 docker buildx build 无限挂起 BUILD_TIMEOUT=1500 NO_CACHE_FLAG="" @@ -22,95 +22,24 @@ for arg in "$@"; do BUILD_ARGS="$BUILD_ARGS --build-arg $arg" done -if ! docker buildx inspect ci-builder > /dev/null 2>&1; then - docker buildx create --use --name ci-builder --driver docker-container - echo "Created ci-builder" -else - docker buildx use ci-builder - echo "Using existing ci-builder" -fi -docker buildx inspect --bootstrap - -# 从cache_ref中提取缓存名称(如 api-cache:develop -> api-cache-develop) -CACHE_NAME=$(echo "$CACHE_REF" | tr '/' '_' | tr ':' '-') -LOCAL_CACHE_DIR="/tmp/buildx-cache/${CACHE_NAME}" - -mkdir -p "$LOCAL_CACHE_DIR" - -# 缓存源:local优先(带自动修复),registry兜底读写 -# 本地缓存损坏时自动清理后重试,避免snapshot not found导致构建全挂 -build_with_cache_retry() { - local attempt=1 - local max_attempts=2 - while [ $attempt -le $max_attempts ]; do - local build_output - local exit_code - set +e - build_output=$(timeout ${BUILD_TIMEOUT} docker buildx build \ - $NO_CACHE_FLAG \ - $BUILD_ARGS \ - --cache-from "type=local,src=${LOCAL_CACHE_DIR}" \ - --cache-from "type=registry,ref=${CACHE_REF}" \ - --cache-to "type=local,dest=${LOCAL_CACHE_DIR},mode=max" \ - --cache-to "type=registry,ref=${CACHE_REF},mode=max,ignore-error=true" \ - -f "${DOCKERFILE}" \ - -t "${IMAGE_TAG}" \ - --push \ - . 2>&1) - exit_code=$? - set -e - if [ $exit_code -eq 0 ]; then - echo "$build_output" - return 0 - fi - # 超时退出(exit code 124) - if [ $exit_code -eq 124 ]; then - echo "❌ Docker build TIMEOUT after ${BUILD_TIMEOUT}s - build hung and was killed" - echo "$build_output" | tail -20 - return $exit_code - fi - # 检测到缓存损坏类错误,清掉本地缓存重试 - if echo "$build_output" | grep -qE "parent snapshot.*not found|snapshot.*does not exist|cache.*corrupt|failed to compute cache key"; then - echo "$build_output" - echo "" - echo "⚠️ Local cache appears corrupted, cleaning up and retrying (attempt $attempt/$max_attempts)..." - rm -rf "${LOCAL_CACHE_DIR}" - mkdir -p "${LOCAL_CACHE_DIR}" - # 清理buildx builder的内部snapshot状态 - docker buildx prune -f -a > /dev/null 2>&1 || true - attempt=$((attempt + 1)) - else - # 非缓存类错误,直接输出并返回 - echo "$build_output" - return $exit_code - fi - done - # 重试完还是失败,不用本地缓存最后试一次(只从registry读) - echo "⚠️ All cached attempts failed, building without local cache..." - timeout ${BUILD_TIMEOUT} docker buildx build \ - $NO_CACHE_FLAG \ - $BUILD_ARGS \ - --cache-from "type=registry,ref=${CACHE_REF}" \ - --cache-to "type=local,dest=${LOCAL_CACHE_DIR},mode=max" \ - --cache-to "type=registry,ref=${CACHE_REF},mode=max,ignore-error=true" \ - -f "${DOCKERFILE}" \ - -t "${IMAGE_TAG}" \ - --push \ - . -} - -echo "=== Step 1: Build & push image (local cache + registry cache, with auto-repair) ===" -echo "Local cache: ${LOCAL_CACHE_DIR}" -echo "Registry cache: ${CACHE_REF}" -echo "Build timeout: ${BUILD_TIMEOUT}s" +echo "=== Build & push image (plain docker build + docker push) ===" +echo "Dockerfile: ${DOCKERFILE}" +echo "Image: ${IMAGE_TAG}" echo "" -build_with_cache_retry +# 使用普通 docker build(镜像会加载到本地 daemon,后续 docker tag 可用) +echo "--- docker build ---" +timeout ${BUILD_TIMEOUT} docker build \ + $NO_CACHE_FLAG \ + $BUILD_ARGS \ + -f "${DOCKERFILE}" \ + -t "${IMAGE_TAG}" \ + . + +echo "" +echo "--- docker push ---" +docker push "${IMAGE_TAG}" echo "" echo "Image pushed: ${IMAGE_TAG}" -echo "Local cache updated" -echo "Registry cache updated (if supported)" - -echo "" echo "Build completed: ${IMAGE_TAG}" -- 2.54.0