feat: 添加更新 Docker daemon.json 配置的脚本
- 新增 h-hosts-docker.sh 脚本,用于安全地向 Docker daemon.json 文件中添加或更新 --add-host 条目 - 脚本实现了以下功能: - 检查是否以 root 或 sudo 权限运行 - 检查 jq 是否已安装 - 检查是否提供了主机和 IP 参数 - 创建 daemon.json 文件(如果不存在) - 备份当前配置文件 - 使用 jq 更新 JSON 文件,添加新的 --add-host 条目并去重 - 显示修改前后的差异 - 脚本使用方法:sudo ./h-hosts-docker.sh "host1:ip1" "host2:ip2" ... - 示例:sudo ./h-hosts-docker.sh "dev.site.com:192.168.1.100" "api.internal:10.0.0.12"
This commit is contained in:
93
h-hosts-docker.sh
Normal file
93
h-hosts-docker.sh
Normal file
@@ -0,0 +1,93 @@
|
||||
#!/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
|
||||
|
||||
# 2. 备份当前配置文件
|
||||
cp "$DAEMON_FILE" "$DAEMON_FILE.bak"
|
||||
echo "📄 已将当前配置备份到 '$DAEMON_FILE.bak'"
|
||||
|
||||
# 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)))' \
|
||||
"$DAEMON_FILE.bak")
|
||||
|
||||
# 5. 将格式化后的 JSON 写回主文件
|
||||
echo "$updated_json" > "$DAEMON_FILE"
|
||||
|
||||
# 6. 显示修改前后的差异
|
||||
echo "🔄 检查文件变更:"
|
||||
diff -u "$DAEMON_FILE.bak" "$DAEMON_FILE"
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "✅ 配置未发生变化,所有条目均已存在。"
|
||||
else
|
||||
echo "✅ 成功更新 '$DAEMON_FILE'!"
|
||||
fi
|
||||
|
||||
# -- 完成 --
|
||||
|
||||
echo ""
|
||||
echo "✨ 操作完成!"
|
||||
echo "🔴 重要: 你必须重启 Docker 守护进程才能使更改生效。"
|
||||
echo " 请运行:"
|
||||
echo " sudo systemctl daemon-reload"
|
||||
echo " sudo systemctl restart docker"
|
||||
echo ""
|
Reference in New Issue
Block a user