Files
Linux/h-hosts-docker.sh
严浩 e3d39a8dfa fix(h-hosts-docker): 添加 JSON 文件验证并备份配置文件
- 在脚本开始时验证 DAEMON_FILE 是否为有效的 JSON 文件
- 如果 JSON 无效,重新创建为空的 JSON 对象
- 添加备份当前配置文件的步骤,以防止意外覆盖
2025-09-04 17:13:20 +08:00

100 lines
3.2 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# ==============================================================================
# update-docker-daemon.sh
#
# 安全地向 Docker 的 daemon.json 配置文件中添加或更新 --add-host 条目。
#
# 依赖: jq (一个轻量级的命令行 JSON 处理器)
#
# 用法:
# sudo ./update-docker-daemon.sh "host1:ip1" "host2:ip2" ...
#
# 示例:
# sudo ./update-docker-daemon.sh "dev.site.com:192.168.1.100" "api.internal:10.0.0.12"
# ==============================================================================
# -- 安全检查 --
# 1. 检查是否以 root 或 sudo 权限运行
if [ "$(id -u)" -ne 0 ]; then
echo "❌ 错误: 此脚本需要以 root 或 sudo 权限运行。"
echo "请尝试使用: sudo $0"
exit 1
fi
# 2. 检查 jq 是否已安装
if ! command -v jq &> /dev/null; then
echo "❌ 错误: 依赖 'jq' 未找到。"
echo "请先安装 jq。例如: sudo apt-get install jq"
exit 1
fi
# 3. 检查是否提供了参数
if [ "$#" -eq 0 ]; then
echo "📝 用法: $0 \"host1:ip1\" \"host2:ip2\" ..."
echo "示例: sudo $0 \"dev.site.com:192.168.1.100\""
exit 1
fi
# -- 配置和变量 --
DAEMON_FILE="/etc/docker/daemon.json"
# -- 主逻辑 --
# 1. 确保配置文件及其目录存在
mkdir -p "$(dirname "$DAEMON_FILE")"
if [ ! -f "$DAEMON_FILE" ] || [ ! -s "$DAEMON_FILE" ]; then
echo "{}" > "$DAEMON_FILE"
echo "🔔 提示: '$DAEMON_FILE' 文件不存在或为空,已为你创建。"
fi
# 验证 JSON 文件格式,如果无效则重新创建
if ! jq empty "$DAEMON_FILE" 2>/dev/null; then
echo "⚠️ 警告: '$DAEMON_FILE' 包含无效的 JSON正在重新创建..."
echo "{}" > "$DAEMON_FILE"
fi
# 2. 备份当前配置文件
BACKUP_FILE="$DAEMON_FILE.bak-$(date +%Y%m%d_%H%M%S)"
cp "$DAEMON_FILE" "$BACKUP_FILE"
echo "📄 已将当前配置备份到 '$BACKUP_FILE'"
# 3. 将所有命令行参数转换为 jq 可以使用的 JSON 数组
# 例如: "host1:ip1" "host2:ip2" -> '["host1:ip1", "host2:ip2"]'
hosts_to_add_json=$(jq -n '$ARGS.positional' --args "$@")
# 4. 使用 jq 更新 JSON 文件
# - (.add_host // []): 如果 `add_host` 存在,则使用它;如果不存在 (null),则使用一个空数组 `[]`。
# - + $hosts_to_add: 将新主机列表与现有列表合并。
# - | unique: 移除所有重复的条目。
# - | del(select(.==null)): 清理可能因为没有旧值而产生的 null
# - 最后将结果赋值回 .add_host
updated_json=$(jq \
--argjson hosts_to_add "$hosts_to_add_json" \
'.add_host = ((.add_host // []) + $hosts_to_add | unique | del(select(.==null)))' \
"$BACKUP_FILE")
# 5. 将格式化后的 JSON 写回主文件
echo "$updated_json" > "$DAEMON_FILE"
# 6. 显示修改前后的差异
echo "🔄 检查文件变更:"
if diff -u "$BACKUP_FILE" "$DAEMON_FILE" > /dev/null; then
echo "✅ 配置未发生变化,所有条目均已存在。"
else
echo "✅ 成功更新 '$DAEMON_FILE'"
echo "变更详情:"
diff -u "$BACKUP_FILE" "$DAEMON_FILE"
fi
# -- 完成 --
echo ""
echo "✨ 操作完成!"
echo "🔴 重要: 你必须重启 Docker 守护进程才能使更改生效。"
echo " 请运行:"
echo " sudo systemctl daemon-reload"
echo " sudo systemctl restart docker"
echo ""