From 88de431b97c77ea43d0dec735d761ea6f36b6d92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=A5=E6=B5=A9?= Date: Thu, 4 Sep 2025 17:03:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=9B=B4=E6=96=B0=20?= =?UTF-8?q?Docker=20daemon.json=20=E9=85=8D=E7=BD=AE=E7=9A=84=E8=84=9A?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 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" --- h-hosts-docker.sh | 93 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 h-hosts-docker.sh diff --git a/h-hosts-docker.sh b/h-hosts-docker.sh new file mode 100644 index 0000000..e57f47d --- /dev/null +++ b/h-hosts-docker.sh @@ -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 "" \ No newline at end of file