嗯,优化了显示顺序与部署逻辑的全新Deploy.sh 2.0

This commit is contained in:
2026-08-05 23:36:54 +08:00
parent 4dde725b56
commit 6038f81248
+125 -15
View File
@@ -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