From 6038f812484a3bf6a3c1a8f52ba49af03fcd4557 Mon Sep 17 00:00:00 2001 From: lxh2875931338 Date: Wed, 5 Aug 2026 23:36:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=97=AF=EF=BC=8C=E4=BC=98=E5=8C=96=E4=BA=86?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=A1=BA=E5=BA=8F=E4=B8=8E=E9=83=A8=E7=BD=B2?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E7=9A=84=E5=85=A8=E6=96=B0Deploy.sh=202.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy.sh | 140 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 125 insertions(+), 15 deletions(-) diff --git a/deploy.sh b/deploy.sh index 351aeda..22648bb 100644 --- a/deploy.sh +++ b/deploy.sh @@ -186,6 +186,33 @@ install_jq() { fi } +# ---------- 镜像加速:确保 daemon.json 存在且有效 ---------- +ensure_daemon_json_valid() { + if [ -f "$DAEMON_JSON" ] && [ -s "$DAEMON_JSON" ]; then + if jq -e '.' "$DAEMON_JSON" >/dev/null 2>&1; then + return 0 + else + local backup_path="${DAEMON_JSON}.bak.$(date +%Y%m%d-%H%M%S)" + cp "$DAEMON_JSON" "$backup_path" + print_warn "daemon.json 格式非法,已备份至: $backup_path" + echo '{}' > "$DAEMON_JSON" + print_info "已重建为有效的 JSON 文件" + return 0 + fi + elif [ -f "$DAEMON_JSON" ] && [ ! -s "$DAEMON_JSON" ]; then + local backup_path="${DAEMON_JSON}.bak.$(date +%Y%m%d-%H%M%S)" + cp "$DAEMON_JSON" "$backup_path" 2>/dev/null || true + print_warn "daemon.json 为空文件,已备份至: $backup_path" + echo '{}' > "$DAEMON_JSON" + print_info "已重建为有效的 JSON 文件" + return 0 + else + print_info "daemon.json 不存在,将创建" + echo '{}' > "$DAEMON_JSON" + return 0 + fi +} + # ---------- 镜像加速:检测阶段 ---------- check_docker_mirrors() { print_step "检测 Docker 镜像源配置..." @@ -219,7 +246,6 @@ check_docker_mirrors() { MIRROR_STATUS="no_file" HAS_REGISTRY_MIRRORS_KEY=false print_info "daemon.json 不存在" - # 生成检测报告 generate_mirror_detect_output return 0 fi @@ -481,38 +507,122 @@ configure_docker_mirrors() { # 构建新镜像列表 local new_mirrors=() if [ "$REORDER" = true ]; then - # 重排:可用前置,不可用后移(仅重排用户配置) new_mirrors=("${USER_MIRRORS_AVAILABLE[@]}" "${USER_MIRRORS_UNAVAILABLE[@]}") - print_info "重排镜像源顺序" + print_info "[反馈] 动作: 重排镜像源顺序" elif [ "$INSERT_DEFAULT" = true ]; then if [ "$MIRROR_STATUS" = "no_file" ] || [ "$MIRROR_STATUS" = "no_key" ] || [ "$MIRROR_STATUS" = "empty_array" ]; then - # 无配置或空配置:直接写入可用默认地址 new_mirrors=("${AVAILABLE_MIRRORS[@]}") - print_info "写入可用默认镜像源" + print_info "[反馈] 动作: 写入可用默认镜像源 (无已有配置)" else - # all_invalid:可用默认地址插入到最前面 new_mirrors=("${AVAILABLE_MIRRORS[@]}" "${USER_MIRRORS_UNAVAILABLE[@]}") - print_info "插入可用默认镜像源到最前面" + print_info "[反馈] 动作: 插入可用默认镜像源到最前面 (用户配置全部不可用)" fi else print_info "无需修改镜像源配置" return 0 fi - # 备份 daemon.json + print_info "[反馈] 新镜像列表: ${new_mirrors[*]}" + + # ============================================================ + # 确保 daemon.json 存在且为有效 JSON + # ============================================================ + print_info "[反馈] 检查 daemon.json 状态..." if [ -f "$DAEMON_JSON" ]; then - local backup_path="${DAEMON_JSON}.bak.$(date +%Y%m%d-%H%M%S)" - cp "$DAEMON_JSON" "$backup_path" - print_info "已备份: $backup_path" + print_info "[反馈] 文件存在: $DAEMON_JSON" + if [ -s "$DAEMON_JSON" ]; then + print_info "[反馈] 文件大小: $(stat -c%s "$DAEMON_JSON" 2>/dev/null || stat -f%z "$DAEMON_JSON" 2>/dev/null) bytes" + else + print_warn "[反馈] 文件为空 (0 bytes)" + fi + else + print_info "[反馈] 文件不存在" fi - # 写入新配置(仅修改 registry-mirrors 字段,保留其他所有字段) + if ! ensure_daemon_json_valid; then + print_error "无法创建或修复 daemon.json" + return 1 + fi + + print_success "[反馈] daemon.json 已就绪 (有效 JSON)" + + # ============================================================ + # 备份 daemon.json(写入前额外备份) + # ============================================================ + local backup_path="${DAEMON_JSON}.bak.$(date +%Y%m%d-%H%M%S)" + cp "$DAEMON_JSON" "$backup_path" + print_info "[反馈] 已备份: $backup_path" + + # ============================================================ + # 构建 JSON 镜像数组 + # ============================================================ + print_info "[反馈] 构建 JSON 镜像数组..." local json_mirrors - json_mirrors=$(printf '%s\n' "${new_mirrors[@]}" | jq -R . | jq -s .) + json_mirrors=$(printf '%s\n' "${new_mirrors[@]}" | jq -R . | jq -s . 2>/dev/null) + if [ -z "$json_mirrors" ] || [ "$json_mirrors" = "[]" ]; then + print_error "[反馈] 构建 JSON 镜像数组失败或为空" + print_error " new_mirrors 内容: ${new_mirrors[*]}" + return 1 + fi + print_info "[反馈] json_mirrors: $json_mirrors" + + # ============================================================ + # 写入新配置(仅修改 registry-mirrors 字段,保留其他所有字段) + # ============================================================ + print_info "[反馈] 执行 jq 写入操作..." + print_info "[反馈] 源文件: $DAEMON_JSON" + print_info "[反馈] 目标文件: ${DAEMON_JSON}.tmp" if ! jq --argjson mirrors "$json_mirrors" '."registry-mirrors" = $mirrors' \ - "$DAEMON_JSON" > "${DAEMON_JSON}.tmp" 2>/dev/null; then - print_error "写入 daemon.json 失败" + "$DAEMON_JSON" > "${DAEMON_JSON}.tmp" 2> "${DAEMON_JSON}.error"; then + print_error "[反馈] jq 执行失败" + print_error "[反馈] 错误详情:" + if [ -f "${DAEMON_JSON}.error" ]; then + cat "${DAEMON_JSON}.error" | while read -r line; do + print_error " $line" + done + rm -f "${DAEMON_JSON}.error" + fi + print_error "[反馈] 检查文件状态:" + if [ -f "$DAEMON_JSON" ]; then + print_error " 源文件存在,大小: $(stat -c%s "$DAEMON_JSON" 2>/dev/null || stat -f%z "$DAEMON_JSON" 2>/dev/null) bytes" + print_error " 源文件内容预览:" + head -c 200 "$DAEMON_JSON" | while read -r line; do + print_error " $line" + done + else + print_error " 源文件不存在!" + fi + if [ -f "${DAEMON_JSON}.tmp" ]; then + print_error " 临时文件已创建,大小: $(stat -c%s "${DAEMON_JSON}.tmp" 2>/dev/null || stat -f%z "${DAEMON_JSON}.tmp" 2>/dev/null) bytes" + [ -s "${DAEMON_JSON}.tmp" ] && print_error " 临时文件内容: $(cat "${DAEMON_JSON}.tmp")" + fi + rm -f "${DAEMON_JSON}.tmp" + return 1 + fi + + # 验证临时文件 + if [ ! -f "${DAEMON_JSON}.tmp" ]; then + print_error "[反馈] 临时文件未生成: ${DAEMON_JSON}.tmp" + return 1 + fi + + if [ ! -s "${DAEMON_JSON}.tmp" ]; then + print_error "[反馈] 临时文件为空: ${DAEMON_JSON}.tmp" + rm -f "${DAEMON_JSON}.tmp" + return 1 + fi + + print_success "[反馈] jq 执行成功,临时文件已生成 (大小: $(stat -c%s "${DAEMON_JSON}.tmp" 2>/dev/null || stat -f%z "${DAEMON_JSON}.tmp" 2>/dev/null) bytes)" + + # 验证临时文件是否为有效 JSON + if ! jq -e '.' "${DAEMON_JSON}.tmp" >/dev/null 2>&1; then + print_error "[反馈] 生成的临时文件不是有效的 JSON" + print_error "[反馈] 内容预览:" + head -c 500 "${DAEMON_JSON}.tmp" | while read -r line; do + print_error " $line" + done + rm -f "${DAEMON_JSON}.tmp" return 1 fi