Files
Linux/h-hosts-docker.sh
严浩 88de431b97 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"
2025-09-04 17:03:00 +08:00

93 lines
2.9 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
# 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 ""