更新至 docker-tools_v2.1.0 版本(修复部分问题;更新 docker 和 docker compose 版本为最新版)

This commit is contained in:
2026-04-24 16:58:05 +09:00
parent c18bec7a97
commit 110aaf4d24
7 changed files with 402 additions and 183 deletions
+16
View File
@@ -0,0 +1,16 @@
{
"permissions": {
"allow": [
"Bash(bash -n docker-tools)",
"WebFetch(domain:github.com)",
"WebFetch(domain:download.docker.com)",
"Bash(ls -la releases/)",
"Bash(find . -maxdepth 3 -type d -name \"release*\" -o -name \"dist\")",
"Bash(unzip -l releases/docker-tools_v2.0.0.zip)",
"Bash(rm -f ../releases/docker-tools_v2.1.0.zip)",
"Bash(zip ../releases/docker-tools_v2.1.0.zip docker-tools daemon.json docker.service docker.socket)",
"Bash(powershell -NoProfile -Command \"Compress-Archive -Path docker-tools,daemon.json,docker.service,docker.socket -DestinationPath ../releases/docker-tools_v2.1.0.zip -Force\")",
"Bash(unzip -l releases/docker-tools_v2.1.0.zip)"
]
}
}
+73 -19
View File
@@ -2,7 +2,7 @@
\[!\[Version](https://img.shields.io/badge/version-2.0.0-blue.svg)](https://git.hty1024.com/HTY1024/shell\_tools/src/branch/main/docker-tools)
\[!\[Version](https://img.shields.io/badge/version-2.1.0-blue.svg)](https://git.hty1024.com/HTY1024/shell\_tools/src/branch/main/docker-tools)
\[!\[License](https://img.shields.io/badge/license-GNU-green.svg)](https://git.hty1024.com/HTY1024/shell\_tools/src/branch/main/LICENSE)
@@ -160,9 +160,9 @@ cd shell\_tools/docker-tools
\# 方式二:直接下载
wget https://git.hty1024.com/HTY1024/shell\_tools/src/branch/main/releases/docker-tools\_v2.0.0.zip
wget https://git.hty1024.com/HTY1024/shell\_tools/src/branch/main/releases/docker-tools\_v2.1.0.zip
unzip docker-tools\_v2.0.0.zip
unzip docker-tools\_v2.1.0.zip
```
@@ -194,7 +194,7 @@ sudo ./docker-tools.sh install
\# 或者指定版本安装
sudo ./docker-tools.sh -v 29.1.4 -c v5.0.1 install
sudo ./docker-tools.sh -v 29.4.1 -c v5.1.3 install
```
@@ -240,7 +240,7 @@ docker info
```bash
\# 默认安装(Docker 29.1.4 + Compose v5.0.1
\# 默认安装(Docker 29.4.1 + Compose v5.1.3
sudo ./docker-tools.sh install
@@ -248,7 +248,7 @@ sudo ./docker-tools.sh install
\# 指定版本安装
sudo ./docker-tools.sh -v 29.1.4 -c v5.0.1 install
sudo ./docker-tools.sh -v 29.4.1 -c v5.1.3 install
@@ -280,13 +280,13 @@ sudo ./docker-tools.sh -i /data/docker/bin -d /data/docker/data install
\# 下载 Docker Engine
wget https://download.docker.com/linux/static/stable/x86\_64/docker-29.1.4.tgz
wget https://download.docker.com/linux/static/stable/x86\_64/docker-29.4.1.tgz
\# 下载 Docker Compose
wget https://github.com/docker/compose/releases/download/v5.0.1/docker-compose-linux-x86\_64
wget https://github.com/docker/compose/releases/download/v5.1.3/docker-compose-linux-x86\_64
```
@@ -300,7 +300,7 @@ wget https://github.com/docker/compose/releases/download/v5.0.1/docker-compose-l
\# 将安装包和脚本上传到同一目录
scp docker-29.1.4.tgz docker-compose-linux-x86\_64 docker-tools.sh user@server:/path/to/dir/
scp docker-29.4.1.tgz docker-compose-linux-x86\_64 docker-tools.sh user@server:/path/to/dir/
```
@@ -312,7 +312,7 @@ scp docker-29.1.4.tgz docker-compose-linux-x86\_64 docker-tools.sh user@server:/
```bash
sudo ./docker-tools.sh -p docker-29.1.4.tgz -n docker-compose-linux-x86\_64 install
sudo ./docker-tools.sh -p docker-29.4.1.tgz -n docker-compose-linux-x86\_64 install
```
@@ -478,7 +478,7 @@ sudo ./docker-tools.sh \\
sudo ./docker-tools.sh \\
  -p docker-29.1.4.tgz \\
  -p docker-29.4.1.tgz \\
  -n docker-compose-linux-x86\_64 \\
@@ -548,13 +548,13 @@ sudo ./docker-tools.sh \\
\# 在线更新到指定版本
sudo ./docker-tools.sh -v 29.1.4 update
sudo ./docker-tools.sh -v 29.4.1 update
\# 离线更新
sudo ./docker-tools.sh -p docker-29.1.4.tgz update
sudo ./docker-tools.sh -p docker-29.4.1.tgz update
```
@@ -572,15 +572,15 @@ sudo ./docker-tools.sh -p docker-29.1.4.tgz update
|------|------|--------|------|
| `-v` | Docker Engine 版本 | 29.1.4 | `-v 28.2.1` |
| `-v` | Docker Engine 版本 | 29.4.1 | `-v 28.2.1` |
| `-i` | Docker 安装目录 | /opt/docker/bin | `-i /data/docker/bin` |
| `-d` | Docker 数据目录 | /opt/docker/data | `-d /data/docker/data` |
| `-p` | Docker Engine 安装包名称(离线) | - | `-p docker-29.1.4.tgz` |
| `-p` | Docker Engine 安装包名称(离线) | - | `-p docker-29.4.1.tgz` |
| `-c` | Docker Compose 版本 | v5.0.1 | `-c v2.36.2` |
| `-c` | Docker Compose 版本 | v5.1.3 | `-c v2.36.2` |
| `-n` | Docker Compose 安装包名称(离线) | - | `-n docker-compose-linux-x86\_64` |
@@ -616,7 +616,7 @@ vim docker-tools.sh
\# 修改以下变量
DOCKER\_VERSION=29.1.4 # Docker 版本
DOCKER\_VERSION=29.4.1 # Docker 版本
DOCKER\_INSTALL\_DIR=/opt/docker/bin # 安装目录
@@ -806,7 +806,7 @@ ls -lh docker-\*.tgz docker-compose-\*
\# 确保文件名正确
./docker-tools.sh -p docker-29.1.4.tgz -n docker-compose-linux-x86\_64 install
./docker-tools.sh -p docker-29.4.1.tgz -n docker-compose-linux-x86\_64 install
```
@@ -934,7 +934,7 @@ sudo rm -rf /tmp/docker-\*
\# 重新安装
sudo ./docker-tools.sh -v 29.1.4 install
sudo ./docker-tools.sh -v 29.4.1 install
```
@@ -1216,6 +1216,60 @@ docker run -d \\
\## 📝 更新日志
\### v2.1.0 (2026-04-24)
\#### 🆕 版本更新
\- 默认 Docker Engine 升级至 \*\*29.4.1\*\*
\- 默认 Docker Compose 升级至 \*\*v5.1.3\*\*
\#### 🐛 问题修复
\- 修复子命令调度:`case "$@"` 多参数无法匹配;`info` 未调用到 `info_docker`
\- 修复 `check_net` 中 TIMEOUT 位置参数误用,以及 2xx/3xx 被错误当作失败码
\- 修复 `backup_file` 对目录无效导致升级前未实际备份
\- 修复 `remove_env` 使用 sed 直删导致残留空行,改用范围删除
\- 修复 `docker.service` 中注释与 `ExecStart=` 残留混行
\- 修复拼写错误(Dokcer / Coimpose / Conpose
\#### ✨ 健壮性增强
\- `config_env` 幂等化:重复安装不再重复追加 `~/.bashrc``/etc/profile`
\- 脚本内不再 `source ~/.bashrc`,避免 `set -u` 下被外部脚本污染中断
\- `daemon.json` 模板替换后校验,防止 `{{...}}` 占位符残留导致 JSON 非法
\- 数据目录仅改 owner,不再 `chmod -R 755`,避免破坏镜像层权限
\- `chown docker.docker` 更新为 `docker:docker`(点分隔语法已弃用)
\- 去掉 `useradd/groupadd` 硬编码 UID/GID=1001,避免与目标机冲突
\- `CPU_ARCH` 改为运行时探测,扩展支持 `aarch64`
\- `getopts` 增加 `?` / `:` 错误分支,且 `-r/-m/-t` 不再隐式启用 Swarm
\- Swarm worker 模式对 Manager IP 与 Token 强校验
\- `only_install_docker_compose` 在 Docker Engine 未运行时跳过 restart/info
\### v2.0.0
\- 重构日志系统、加入 `set -euo pipefail`、完善交互确认
\### v1.3.x / v1.2.x / v1.1.x
\- 详见 git 提交历史
\## 👤 作者
+73 -19
View File
@@ -2,7 +2,7 @@
\[!\[Version](https://img.shields.io/badge/version-2.0.0-blue.svg)](https://git.hty1024.com/HTY1024/shell\_tools/src/branch/main/docker-tools)
\[!\[Version](https://img.shields.io/badge/version-2.1.0-blue.svg)](https://git.hty1024.com/HTY1024/shell\_tools/src/branch/main/docker-tools)
\[!\[License](https://img.shields.io/badge/license-GNU-green.svg)](https://git.hty1024.com/HTY1024/shell\_tools/src/branch/main/LICENSE)
@@ -160,9 +160,9 @@ cd shell\_tools/docker-tools
\# Method 2: Direct download
wget https://git.hty1024.com/HTY1024/shell\_tools/src/branch/main/releases/docker-tools\_v2.0.0.zip
wget https://git.hty1024.com/HTY1024/shell\_tools/src/branch/main/releases/docker-tools\_v2.1.0.zip
unzip docker-tools\_v2.0.0.zip
unzip docker-tools\_v2.1.0.zip
```
@@ -194,7 +194,7 @@ sudo ./docker-tools.sh install
\# Or specify version
sudo ./docker-tools.sh -v 29.1.4 -c v5.0.1 install
sudo ./docker-tools.sh -v 29.4.1 -c v5.1.3 install
```
@@ -240,7 +240,7 @@ docker info
```bash
\# Default installation (Docker 29.1.4 + Compose v5.0.1)
\# Default installation (Docker 29.4.1 + Compose v5.1.3)
sudo ./docker-tools.sh install
@@ -248,7 +248,7 @@ sudo ./docker-tools.sh install
\# Specify version
sudo ./docker-tools.sh -v 29.1.4 -c v5.0.1 install
sudo ./docker-tools.sh -v 29.4.1 -c v5.1.3 install
@@ -280,13 +280,13 @@ Download packages on a machine with network access:
\# Download Docker Engine
wget https://download.docker.com/linux/static/stable/x86\_64/docker-29.1.4.tgz
wget https://download.docker.com/linux/static/stable/x86\_64/docker-29.4.1.tgz
\# Download Docker Compose
wget https://github.com/docker/compose/releases/download/v5.0.1/docker-compose-linux-x86\_64
wget https://github.com/docker/compose/releases/download/v5.1.3/docker-compose-linux-x86\_64
```
@@ -300,7 +300,7 @@ wget https://github.com/docker/compose/releases/download/v5.0.1/docker-compose-l
\# Upload packages and script to the same directory
scp docker-29.1.4.tgz docker-compose-linux-x86\_64 docker-tools.sh user@server:/path/to/dir/
scp docker-29.4.1.tgz docker-compose-linux-x86\_64 docker-tools.sh user@server:/path/to/dir/
```
@@ -312,7 +312,7 @@ scp docker-29.1.4.tgz docker-compose-linux-x86\_64 docker-tools.sh user@server:/
```bash
sudo ./docker-tools.sh -p docker-29.1.4.tgz -n docker-compose-linux-x86\_64 install
sudo ./docker-tools.sh -p docker-29.4.1.tgz -n docker-compose-linux-x86\_64 install
```
@@ -478,7 +478,7 @@ sudo ./docker-tools.sh \\
sudo ./docker-tools.sh \\
  -p docker-29.1.4.tgz \\
  -p docker-29.4.1.tgz \\
  -n docker-compose-linux-x86\_64 \\
@@ -548,13 +548,13 @@ sudo ./docker-tools.sh \\
\# Online update to specified version
sudo ./docker-tools.sh -v 29.1.4 update
sudo ./docker-tools.sh -v 29.4.1 update
\# Offline update
sudo ./docker-tools.sh -p docker-29.1.4.tgz update
sudo ./docker-tools.sh -p docker-29.4.1.tgz update
```
@@ -572,15 +572,15 @@ sudo ./docker-tools.sh -p docker-29.1.4.tgz update
|-----------|-------------|---------|---------|
| `-v` | Docker Engine version | 29.1.4 | `-v 28.2.1` |
| `-v` | Docker Engine version | 29.4.1 | `-v 28.2.1` |
| `-i` | Docker installation directory | /opt/docker/bin | `-i /data/docker/bin` |
| `-d` | Docker data directory | /opt/docker/data | `-d /data/docker/data` |
| `-p` | Docker Engine package name (offline) | - | `-p docker-29.1.4.tgz` |
| `-p` | Docker Engine package name (offline) | - | `-p docker-29.4.1.tgz` |
| `-c` | Docker Compose version | v5.0.1 | `-c v2.36.2` |
| `-c` | Docker Compose version | v5.1.3 | `-c v2.36.2` |
| `-n` | Docker Compose package name (offline) | - | `-n docker-compose-linux-x86\_64` |
@@ -616,7 +616,7 @@ vim docker-tools.sh
\# Modify these variables
DOCKER\_VERSION=29.1.4 # Docker version
DOCKER\_VERSION=29.4.1 # Docker version
DOCKER\_INSTALL\_DIR=/opt/docker/bin # Installation directory
@@ -806,7 +806,7 @@ ls -lh docker-\*.tgz docker-compose-\*
\# Ensure correct filenames
./docker-tools.sh -p docker-29.1.4.tgz -n docker-compose-linux-x86\_64 install
./docker-tools.sh -p docker-29.4.1.tgz -n docker-compose-linux-x86\_64 install
```
@@ -934,7 +934,7 @@ sudo rm -rf /tmp/docker-\*
\# Reinstall
sudo ./docker-tools.sh -v 29.1.4 install
sudo ./docker-tools.sh -v 29.4.1 install
```
@@ -1216,6 +1216,60 @@ docker run -d \\
\## 📝 Changelog
\### v2.1.0 (2026-04-24)
\#### 🆕 Version Updates
\- Default Docker Engine bumped to \*\*29.4.1\*\*
\- Default Docker Compose bumped to \*\*v5.1.3\*\*
\#### 🐛 Bug Fixes
\- Fix subcommand dispatch: `case "$@"` failed on multi-arg; `info` missed `info_docker`
\- Fix `check_net` TIMEOUT positional-param misuse, and 2xx/3xx incorrectly treated as failures
\- Fix `backup_file` not working on directories (upgrades previously skipped backup)
\- Fix `remove_env` leaving blank lines; switched to range deletion via sed
\- Fix leftover mixed line with comment and `ExecStart=` in `docker.service`
\- Fix typos (Dokcer / Coimpose / Conpose)
\#### ✨ Robustness
\- `config_env` is now idempotent — repeated installs no longer duplicate `~/.bashrc` / `/etc/profile`
\- No longer `source ~/.bashrc` inside the script (prevents `set -u` crashes from third-party rc files)
\- Validate `daemon.json` after template substitution to catch unfilled `{{...}}` placeholders
\- Data directory owner-only changes; dropped `chmod -R 755` which could break image layer permissions
\- Replace deprecated `chown docker.docker` with `docker:docker`
\- Remove hardcoded UID/GID=1001 in `useradd/groupadd` to avoid collisions
\- `CPU_ARCH` is now runtime-detected; `aarch64` supported
\- `getopts` now handles unknown/missing-arg options; `-r/-m/-t` no longer implicitly enable Swarm
\- Strong validation of Manager IP and Token for Swarm worker role
\- `only_install_docker_compose` skips restart/info when Docker Engine isn't running
\### v2.0.0
\- Logging refactor, `set -euo pipefail`, interactive confirmations
\### v1.3.x / v1.2.x / v1.1.x
\- See git history
\## 👤 Author
+73 -19
View File
@@ -2,7 +2,7 @@
\[!\[Version](https://img.shields.io/badge/version-2.0.0-blue.svg)](https://git.hty1024.com/HTY1024/shell\_tools/src/branch/main/docker-tools)
\[!\[Version](https://img.shields.io/badge/version-2.1.0-blue.svg)](https://git.hty1024.com/HTY1024/shell\_tools/src/branch/main/docker-tools)
\[!\[License](https://img.shields.io/badge/license-GNU-green.svg)](https://git.hty1024.com/HTY1024/shell\_tools/src/branch/main/LICENSE)
@@ -160,9 +160,9 @@ cd shell\_tools/docker-tools
\# 方法 2: 直接ダウンロード
wget https://git.hty1024.com/HTY1024/shell\_tools/src/branch/main/releases/docker-tools\_v2.0.0.zip
wget https://git.hty1024.com/HTY1024/shell\_tools/src/branch/main/releases/docker-tools\_v2.1.0.zip
unzip docker-tools\_v2.0.0.zip
unzip docker-tools\_v2.1.0.zip
```
@@ -194,7 +194,7 @@ sudo ./docker-tools.sh install
\# またはバージョンを指定
sudo ./docker-tools.sh -v 29.1.4 -c v5.0.1 install
sudo ./docker-tools.sh -v 29.4.1 -c v5.1.3 install
```
@@ -240,7 +240,7 @@ docker info
```bash
\# デフォルトインストール (Docker 29.1.4 + Compose v5.0.1)
\# デフォルトインストール (Docker 29.4.1 + Compose v5.1.3)
sudo ./docker-tools.sh install
@@ -248,7 +248,7 @@ sudo ./docker-tools.sh install
\# バージョン指定
sudo ./docker-tools.sh -v 29.1.4 -c v5.0.1 install
sudo ./docker-tools.sh -v 29.4.1 -c v5.1.3 install
@@ -280,13 +280,13 @@ sudo ./docker-tools.sh -i /data/docker/bin -d /data/docker/data install
\# Docker Engine のダウンロード
wget https://download.docker.com/linux/static/stable/x86\_64/docker-29.1.4.tgz
wget https://download.docker.com/linux/static/stable/x86\_64/docker-29.4.1.tgz
\# Docker Compose のダウンロード
wget https://github.com/docker/compose/releases/download/v5.0.1/docker-compose-linux-x86\_64
wget https://github.com/docker/compose/releases/download/v5.1.3/docker-compose-linux-x86\_64
```
@@ -300,7 +300,7 @@ wget https://github.com/docker/compose/releases/download/v5.0.1/docker-compose-l
\# パッケージとスクリプトを同じディレクトリにアップロード
scp docker-29.1.4.tgz docker-compose-linux-x86\_64 docker-tools.sh user@server:/path/to/dir/
scp docker-29.4.1.tgz docker-compose-linux-x86\_64 docker-tools.sh user@server:/path/to/dir/
```
@@ -312,7 +312,7 @@ scp docker-29.1.4.tgz docker-compose-linux-x86\_64 docker-tools.sh user@server:/
```bash
sudo ./docker-tools.sh -p docker-29.1.4.tgz -n docker-compose-linux-x86\_64 install
sudo ./docker-tools.sh -p docker-29.4.1.tgz -n docker-compose-linux-x86\_64 install
```
@@ -478,7 +478,7 @@ sudo ./docker-tools.sh \\
sudo ./docker-tools.sh \\
  -p docker-29.1.4.tgz \\
  -p docker-29.4.1.tgz \\
  -n docker-compose-linux-x86\_64 \\
@@ -548,13 +548,13 @@ sudo ./docker-tools.sh \\
\# 指定バージョンへのオンライン更新
sudo ./docker-tools.sh -v 29.1.4 update
sudo ./docker-tools.sh -v 29.4.1 update
\# オフライン更新
sudo ./docker-tools.sh -p docker-29.1.4.tgz update
sudo ./docker-tools.sh -p docker-29.4.1.tgz update
```
@@ -572,15 +572,15 @@ sudo ./docker-tools.sh -p docker-29.1.4.tgz update
|-----------|------|-----------|-----|
| `-v` | Docker Engine バージョン | 29.1.4 | `-v 28.2.1` |
| `-v` | Docker Engine バージョン | 29.4.1 | `-v 28.2.1` |
| `-i` | Docker インストールディレクトリ | /opt/docker/bin | `-i /data/docker/bin` |
| `-d` | Docker データディレクトリ | /opt/docker/data | `-d /data/docker/data` |
| `-p` | Docker Engine パッケージ名 (オフライン) | - | `-p docker-29.1.4.tgz` |
| `-p` | Docker Engine パッケージ名 (オフライン) | - | `-p docker-29.4.1.tgz` |
| `-c` | Docker Compose バージョン | v5.0.1 | `-c v2.36.2` |
| `-c` | Docker Compose バージョン | v5.1.3 | `-c v2.36.2` |
| `-n` | Docker Compose パッケージ名 (オフライン) | - | `-n docker-compose-linux-x86\_64` |
@@ -616,7 +616,7 @@ vim docker-tools.sh
\# これらの変数を変更
DOCKER\_VERSION=29.1.4 # Docker バージョン
DOCKER\_VERSION=29.4.1 # Docker バージョン
DOCKER\_INSTALL\_DIR=/opt/docker/bin # インストールディレクトリ
@@ -806,7 +806,7 @@ ls -lh docker-\*.tgz docker-compose-\*
\# 正しいファイル名を確認
./docker-tools.sh -p docker-29.1.4.tgz -n docker-compose-linux-x86\_64 install
./docker-tools.sh -p docker-29.4.1.tgz -n docker-compose-linux-x86\_64 install
```
@@ -934,7 +934,7 @@ sudo rm -rf /tmp/docker-\*
\# 再インストール
sudo ./docker-tools.sh -v 29.1.4 install
sudo ./docker-tools.sh -v 29.4.1 install
```
@@ -1216,6 +1216,60 @@ docker run -d \\
\## 📝 変更履歴
\### v2.1.0 (2026-04-24)
\#### 🆕 バージョン更新
\- デフォルト Docker Engine を \*\*29.4.1\*\* に更新
\- デフォルト Docker Compose を \*\*v5.1.3\*\* に更新
\#### 🐛 バグ修正
\- サブコマンド分岐の修正:`case "$@"` が複数引数で一致しない問題、`info``info_docker` を呼べていなかった問題
\- `check_net` の TIMEOUT 位置パラメータ誤用および 2xx/3xx を失敗扱いにしていた不具合を修正
\- `backup_file` がディレクトリに対して機能せず、アップグレード時にバックアップされていなかった問題を修正
\- `remove_env` が sed で残す空行を、範囲削除に切り替え
\- `docker.service` のコメントと `ExecStart=` が同一行に残っていた残骸を修正
\- スペルミスを修正(Dokcer / Coimpose / Conpose
\#### ✨ 堅牢性向上
\- `config_env` を冪等化:再インストール時に `~/.bashrc``/etc/profile` への重複追記を回避
\- スクリプト内で `source ~/.bashrc` を実行しないように変更(`set -u` 時の外部 rc による中断を防止)
\- `daemon.json` のテンプレート置換後に `{{...}}` の残留を検証
\- データディレクトリは owner のみ変更し、`chmod -R 755` によるイメージレイヤ権限破壊を回避
\- 非推奨の `chown docker.docker``docker:docker` に更新
\- `useradd/groupadd` のハードコード UID/GID=1001 を削除し衝突を防止
\- `CPU_ARCH` をランタイム検出に変更、`aarch64` をサポート
\- `getopts` に不明オプション / 引数欠落の分岐を追加。`-r/-m/-t` は Swarm を暗黙に有効化しない
\- Swarm worker 役割での Manager IP と Token の強制バリデーション
\- `only_install_docker_compose` は Docker Engine 未稼働時に restart/info をスキップ
\### v2.0.0
\- ロギングの再構築、`set -euo pipefail` の導入、インタラクティブ確認
\### v1.3.x / v1.2.x / v1.1.x
\- Git 履歴を参照
\## 👤 著者
+166 -125
View File
@@ -5,12 +5,12 @@ set -euo pipefail
# 参数配置
## 版本号
VERSION=2.0.0
VERSION=2.1.0
## 当前的日期、日期时间
DATE="$(date '+%Y%m%d')"
DATETIME="$(date '+%Y%m%d_%H%M%S')"
## 服务器 CPU 架构
CPU_ARCH=x86_64
## 服务器 CPU 架构(运行时自动探测,见 check_cpu_arch
CPU_ARCH=""
## 系统配置文件目录
SYSTEMD_DIR=/usr/lib/systemd/system
## Docker 安装目录
@@ -22,15 +22,15 @@ NEED_OFFLINE_INSTALL=true
## 是否安装 Docker Engine
NEED_INSTALL_ENGINE=true
## Docker 版本号
DOCKER_VERSION=29.1.4
DOCKER_VERSION=29.4.1
## Docker 安装包下载地址(在线安装时使用)
DOCKER_PACKAGE_URL=https://download.docker.com/linux/static/stable
## Docker 安装包名称(离线安装时使用)
DOCKER_PACKAGE_NAME=docker-29.1.4.tgz
DOCKER_PACKAGE_NAME=docker-29.4.1.tgz
## 是否安装 Docker Compose
NEED_INSTALL_COMPOSE=true
## Docker Compose 版本号
DOCKER_COMPOSE_VERSION=v5.0.1
DOCKER_COMPOSE_VERSION=v5.1.3
## Docker Compose 安装包下载地址(在线安装时使用)
DOCKER_COMPOSE_PACKAGE_URL=https://github.com/docker/compose/releases/download
## Docker Compose 安装包名称(离线安装时使用)
@@ -91,14 +91,19 @@ log_success () {
echo -e "${COLOR_BOLD_GREEN}[INFO]${COLOR_RESET} [$(date '+%Y-%m-%d %H:%M:%S')] ${COLOR_GREEN}$* ${COLOR_RESET}"
}
## 备份文件
## 备份文件或目录
backup_file () {
local file="$1"
local backup="${file}.bak.$(date '+%Y%m%d_%H%M%S')"
if [[ -f "$file" ]]; then
cp -rpf "$file" "$backup" || log_warning "备份 $file 失败"
log_info "已备份: $file -> $backup"
local src="$1"
local backup="${src}.bak.$(date '+%Y%m%d_%H%M%S')"
# 时间戳到秒,若 1 秒内连续调用则追加进程号避免覆盖
if [[ -e "$backup" ]]; then
backup="${backup}.$$"
fi
if [[ -e "$src" ]]; then
cp -rpf "$src" "$backup" || log_warning "备份 $src 失败"
log_info "已备份: $src -> $backup"
fi
}
@@ -126,10 +131,15 @@ check_root () {
## 检查 CPU 架构
check_cpu_arch () {
CPU_ARCH="$(arch)"
if [[ ${CPU_ARCH} != "x86_64" ]]; then
log_error "不支持的 CPU 架构!"
fi
CPU_ARCH="$(uname -m)"
case "${CPU_ARCH}" in
x86_64|aarch64)
log_info "检测到 CPU 架构: ${CPU_ARCH}"
;;
*)
log_error "不支持的 CPU 架构: ${CPU_ARCH}(仅支持 x86_64、aarch64)!"
;;
esac
}
## 检查发行版
@@ -207,6 +217,36 @@ check_file () {
fi
}
## 检查 URL 是否可达(通用)
check_url_reachable () {
local url="$1"
local label="$2"
local timeout="${3:-10}"
local http_code
# 允许 curl 失败,自己根据返回码判断
http_code=$(curl -sSL -o /dev/null -w "%{http_code}" --connect-timeout "${timeout}" --max-time $((timeout * 3)) "${url}" || echo "000")
log_debug "${url} -> ${http_code}"
case "${http_code}" in
2??|3??)
return 0
;;
000)
log_error "无法获取 ${label} 网络不可达(连接失败)!"
;;
4??)
log_error "无法获取 ${label} 客户端错误(${http_code})!"
;;
5??)
log_error "无法获取 ${label} 服务器错误(${http_code})!"
;;
*)
log_error "无法获取 ${label} 未知响应码(${http_code})!"
;;
esac
}
## 检查网络
check_net () {
# 在线安装时,检查是否能正常获取安装包
@@ -218,22 +258,7 @@ check_net () {
log_error "请在【 DOCKER_PACKAGE_URL 】中配置 Docker Engine 安装包下载路径!"
fi
local URL="${DOCKER_PACKAGE_URL}"
local TIMEOUT="${2:-10}"
local HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout "$TIMEOUT" "$URL")
log_debug $URL $HTTP_CODE
case "$HTTP_CODE" in
400|401|403|404|405)
log_error "无法获取 Docker Engine 安装包: 客户端错误(4xx)!"
;;
500|502|503|504)
log_error "无法获取 Docker Engine 安装包: 服务器错误(5xx)!"
;;
000)
log_error "无法获取 Docker Engine 安装包: 无法连接!"
;;
esac
check_url_reachable "${DOCKER_PACKAGE_URL}/${CPU_ARCH}/docker-${DOCKER_VERSION}.tgz" "Docker Engine 安装包" 10
if [[ "${NEED_INSTALL_COMPOSE}" == true ]]; then
if [[ -z "${DOCKER_COMPOSE_VERSION}" ]]; then
@@ -243,23 +268,8 @@ check_net () {
log_error "请在【 DOCKER_COMPOSE_PACKAGE_URL 】中配置 Docker Compose 安装包下载路径!"
fi
URL="${DOCKER_COMPOSE_PACKAGE_URL}"
TIMEOUT="${2:-10}"
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout "$TIMEOUT" "$URL")
log_debug $URL $HTTP_CODE
case "$HTTP_CODE" in
400|401|403|404|405)
log_error "无法获取 Docker Compose 安装包: 客户端错误(4xx)!"
;;
500|502|503|504)
log_error "无法获取 Docker Compose 安装包: 服务器错误(5xx)!"
;;
000)
log_error "无法获取 Docker Compose 安装包: 无法连接!"
;;
esac
check_url_reachable "${DOCKER_COMPOSE_PACKAGE_URL}/${DOCKER_COMPOSE_VERSION}/docker-compose-linux-${CPU_ARCH}" "Docker Compose 安装包" 10
fi
fi
}
@@ -287,11 +297,11 @@ help () {
echo -e ""
echo -e "${COLOR_BOLD_GREEN}使用方式: docker-tools 参数 选项"
echo -e "${COLOR_BOLD_BLUE}参数说明:"
echo -e " ${COLOR_BLUE}-v Docker 版本(可选,默认安装 28.2.1 版本)"
echo -e " ${COLOR_BLUE}-v Docker 版本(可选,默认安装 29.4.1 版本)"
echo -e " ${COLOR_BLUE}-i Docker 安装目录(可选,默认为 /opt/docker/bin"
echo -e " ${COLOR_BLUE}-d Docker 数据目录(可选,默认为 /opt/docker/data"
echo -e " ${COLOR_BLUE}-p Docker 安装包名称(可选,仅离线安装时使用,默认为在线安装)"
echo -e " ${COLOR_BLUE}-c Docker Compose 版本(可选,默认安装 v2.36.2 版本)"
echo -e " ${COLOR_BLUE}-c Docker Compose 版本(可选,默认安装 v5.1.3 版本)"
echo -e " ${COLOR_BLUE}-n Docker Compose 安装包名称(可选,仅离线安装时使用,默认为在线安装)"
echo -e " ${COLOR_BLUE}-a 仅安装 Docker Engine(可选,默认安装 Docker Engine 和 Docker Compose "
echo -e " ${COLOR_BLUE}-b 仅安装 Docker Compose(可选,默认安装 Docker Engine 和 Docker Compose "
@@ -318,8 +328,8 @@ help () {
echo -e " ${COLOR_GREEN}安装 Docker (使用自定义配置) docker-tools -v 28.2.1 -i /data/docker/bin -d /data/docker/data -p docker-28.2.1.tgz -c v2.36.2 -n docker-compose-linux-x86_64 install"
echo -e " ${COLOR_GREEN}安装 Docker (同时作为 manager 节点启用 Swarm docker-tools -s install"
echo -e " ${COLOR_GREEN}安装 Docker (同时作为 worker 节点启用 Swarm docker-tools -s -r worker -m 192.168.0.100 -t 123456 install"
echo -e " ${COLOR_GREEN}安装 Docker (仅安装 Docker Engine docker-tools -oe install"
echo -e " ${COLOR_GREEN}安装 Docker (仅安装 Docker Compose docker-tools -oc install"
echo -e " ${COLOR_GREEN}安装 Docker (仅安装 Docker Engine docker-tools -a install"
echo -e " ${COLOR_GREEN}安装 Docker (仅安装 Docker Compose docker-tools -b install"
echo -e " ${COLOR_GREEN}卸载 Docker (使用默认配置) docker-tools uninstall"
echo -e " ${COLOR_GREEN}卸载 Docker (使用自定义配置) docker-tools -v 28.2.1 -i /data/docker/bin -d /data/docker/data -p docker-28.2.1.tgz -c v2.36.2 -n docker-compose-linux-x86_64 uninstall"
echo -e " ${COLOR_GREEN}重启 Docker docker-tools restart"
@@ -330,15 +340,11 @@ help () {
echo -e " ${COLOR_GREEN}查看 Docker 信息 docker-tools info"
}
## 查询 CPU 架构
## 查询 CPU 架构(等价于 check_cpu_arch,保留向后兼容)
search_cpu_arch () {
log_info '------------------------------ 开始设置 CPU 架构... ------------------------------'
CPU_ARCH="$(arch)"
if [[ ${CPU_ARCH} != "x86_64" ]]; then
log_error "不支持的 CPU 架构!"
fi
check_cpu_arch
log_info '------------------------------ CPU 架构设置完成! ------------------------------'
}
@@ -372,14 +378,15 @@ create_user () {
if getent group docker >/dev/null 2>&1; then
log_info "用户组 docker 已存在"
else
groupadd -r -g 1001 docker || log_error "创建用户组失败"
# 不硬编码 GID,避免目标机 1001 被占用
groupadd -r docker || log_error "创建用户组失败"
fi
if id docker >/dev/null 2>&1; then
log_info "用户 docker 已存在"
else
useradd -r -g docker -u 1001 -d /home/docker -s /bin/bash docker || log_error "创建用户失败"
fi
useradd -r -g docker -d /home/docker -s /bin/bash docker || log_error "创建用户失败"
fi
log_info '------------------------------ Docker 用户创建完成! ------------------------------'
}
@@ -482,7 +489,7 @@ install_docker_engine () {
log_info '------------------------------ Docker Engine 安装完成! ------------------------------'
}
## 备份当前 Docker Engine () {
## 备份当前 Docker Engine
backup_docker_engine () {
log_info '------------------------------ 开始备份 Docker Engine... ------------------------------'
@@ -491,18 +498,18 @@ backup_docker_engine () {
log_info '------------------------------ Docker Engine 备份完成! ------------------------------'
}
## 安装 Dokcer Compose
## 安装 Docker Compose
install_docker_compose () {
log_info '------------------------------ 开始安装 Docker Compose... ------------------------------'
cp -rpf ./"${DOCKER_COMPOSE_PACKAGE_NAME}" "${DOCKER_INSTALL_DIR}"/docker-compose
chown docker.docker "${DOCKER_INSTALL_DIR}"/docker-compose
chown docker:docker "${DOCKER_INSTALL_DIR}"/docker-compose
chmod +x "${DOCKER_INSTALL_DIR}"/docker-compose
log_info '------------------------------ Docker Compose 安装完成! ------------------------------'
}
## 备份当前 Docker Coimpose
## 备份当前 Docker Compose
backup_docker_compose () {
log_info '------------------------------ 开始备份 Docker Compose... ------------------------------'
@@ -512,25 +519,35 @@ backup_docker_compose () {
log_info '------------------------------ Docker Compose 备份完成! ------------------------------'
}
## 写入环境变量段(幂等:若已存在则先删旧块再写新块)
_write_env_block () {
local target="$1"
[[ -f "$target" ]] || touch "$target"
backup_file "$target"
# 幂等:若已有旧块先删除
if grep -q '# Docker Env Begin' "$target"; then
sed -i '/# Docker Env Begin/,/# Docker Env End/d' "$target"
fi
cat >> "$target" <<EOF
# Docker Env Begin
export DOCKER_HOME=${DOCKER_INSTALL_DIR}
export PATH=\$PATH:\$DOCKER_HOME
# Docker Env End
EOF
}
## 配置环境变量
config_env () {
log_info '------------------------------ 开始配置环境变量... ------------------------------'
backup_file ~/.bashrc
echo '# Docker Env Begin' >> ~/.bashrc
echo 'export DOCKER_HOME='"${DOCKER_INSTALL_DIR}" >> ~/.bashrc
echo 'export PATH=$PATH:$DOCKER_HOME' >> ~/.bashrc
echo '# Docker Env End' >> ~/.bashrc
source ~/.bashrc
log_info '请手动执行【 source ~/.bashrc 】更新环境变量!'
_write_env_block ~/.bashrc
_write_env_block /etc/profile
backup_file /etc/profile
echo '# Docker Env Begin' >> /etc/profile
echo 'export DOCKER_HOME='"${DOCKER_INSTALL_DIR}" >> /etc/profile
echo 'export PATH=$PATH:$DOCKER_HOME' >> /etc/profile
echo '# Docker Env End' >> /etc/profile
#source /etc/profile
log_info '请手动执行【 source /etc/profile 】更新环境变量!'
# 不在脚本中 source:set -u 下其它脚本的未定义变量会导致本脚本中止
log_info '请手动执行【 source ~/.bashrc 】和【 source /etc/profile 】更新环境变量!'
log_info '------------------------------ 环境变量配置完成! ------------------------------'
}
@@ -539,21 +556,18 @@ config_env () {
remove_env () {
log_info '------------------------------ 开始移除环境变量... ------------------------------'
backup_file ~/.bashrc
sed -i 's/# Docker Env Begin//g' ~/.bashrc
sed -i 's#export DOCKER_HOME='"${DOCKER_INSTALL_DIR}"'##g' ~/.bashrc
sed -i 's/export PATH=$PATH:$DOCKER_HOME//g' ~/.bashrc
sed -i 's/# Docker Env End//g' ~/.bashrc
source ~/.bashrc
log_info '请手动执行 source ~/.bashrc 更新环境变量!'
if [[ -f ~/.bashrc ]]; then
backup_file ~/.bashrc
# 范围删除:从 "# Docker Env Begin" 到 "# Docker Env End"(含首尾)
sed -i '/# Docker Env Begin/,/# Docker Env End/d' ~/.bashrc
log_info '请手动执行【 source ~/.bashrc 】更新环境变量!'
fi
backup_file /etc/profile
sed -i 's/# Docker Env Begin//g' /etc/profile
sed -i 's#export DOCKER_HOME='"${DOCKER_INSTALL_DIR}"'##g' /etc/profile
sed -i 's/export PATH=$PATH:$DOCKER_HOME//g' /etc/profile
sed -i 's/# Docker Env End//g' /etc/profile
#source /etc/profile
log_info '请手动执行 source /etc/profile 更新环境变量!'
if [[ -f /etc/profile ]]; then
backup_file /etc/profile
sed -i '/# Docker Env Begin/,/# Docker Env End/d' /etc/profile
log_info '请手动执行【 source /etc/profile 】更新环境变量!'
fi
log_info '------------------------------ 环境变量移除完成! ------------------------------'
}
@@ -581,7 +595,7 @@ remove_service () {
log_info '------------------------------ 系统服务移除完成! ------------------------------'
}
## 配置 Docker
## 配置 Docker
config_docker_engine () {
log_info '------------------------------ 开始配置 Docker... ------------------------------'
@@ -590,15 +604,20 @@ config_docker_engine () {
if [[ "${NEED_ENABLE_DOCKER_SWARM}" == false ]]; then
sed -i 's#{{DOCKER_LIVE_RESTORE}}#true#g' /etc/docker/daemon.json
fi
if [[ "${NEED_ENABLE_DOCKER_SWARM}" == true ]]; then
else
sed -i 's#{{DOCKER_LIVE_RESTORE}}#false#g' /etc/docker/daemon.json
fi
chown -R docker.docker "${DOCKER_INSTALL_DIR}"
# 校验模板占位符是否已全部替换,避免写入非法 JSON
if grep -q '{{' /etc/docker/daemon.json; then
log_error "/etc/docker/daemon.json 存在未替换的占位符,请检查模板!"
fi
chown -R docker:docker "${DOCKER_INSTALL_DIR}"
chmod -R 755 "${DOCKER_INSTALL_DIR}"
chown -R docker.docker "${DOCKER_DATA_DIR}"
chmod -R 755 "${DOCKER_DATA_DIR}"
# 数据目录仅改 owner,不递归 chmod,避免破坏镜像层原有权限
chown -R docker:docker "${DOCKER_DATA_DIR}"
chmod 711 "${DOCKER_DATA_DIR}"
log_info '------------------------------ Docker 配置完成! ------------------------------'
}
@@ -645,7 +664,7 @@ disable_docker () {
log_info '------------------------------ Docker 自启动取消完成! ------------------------------'
}
## 查询 Dokcer 信息
## 查询 Docker 信息
info_docker () {
log_info '------------------------------ 开始查询 Docker 信息... ------------------------------'
@@ -685,13 +704,19 @@ only_install_docker_compose () {
download_docker_compose_package
fi
install_docker_compose
restart_docker
info_docker
log_info '------------------------------ Docker Conpose 安装完成! ------------------------------'
# 仅当 docker 服务可用时才重启并查询 info
if systemctl list-unit-files docker.service >/dev/null 2>&1 && systemctl is-active --quiet docker; then
restart_docker
info_docker
else
log_info 'Docker Engine 尚未安装或未运行,跳过 restart/info 步骤。'
fi
log_info '------------------------------ Docker Compose 安装完成! ------------------------------'
}
## 更新 Dokcer Engine
## 更新 Docker Engine
only_update_docker_engine () {
log_info '------------------------------ 开始更新 Docker Engine... ------------------------------'
@@ -711,7 +736,7 @@ only_update_docker_engine () {
log_info '------------------------------ Docker Engine 更新完成! ------------------------------'
}
## 更新 Dokcer Compose
## 更新 Docker Compose
only_update_docker_compose () {
log_info '------------------------------ 开始更新 Docker Compose... ------------------------------'
@@ -723,21 +748,24 @@ only_update_docker_compose () {
restart_docker
info_docker
log_info '------------------------------ Docker Conpose 更新完成! ------------------------------'
log_info '------------------------------ Docker Compose 更新完成! ------------------------------'
}
## 启用 Docker Swarm
only_enable_docker_swarm () {
log_info '------------------------------ 开始启用 Docker Swarm... ------------------------------'
sed -i 's#"live-restore": true#"live-restore": false#g' /etc/docker/daemon.json
restart_docker
if [ "${DOCKER_SWARM_ROLE}" == "manager" ]; then
docker swarm init --advertise-addr "${DOCKER_SWARM_MANAGER_IP}"
if [[ -f /etc/docker/daemon.json ]]; then
sed -i 's#"live-restore": true#"live-restore": false#g' /etc/docker/daemon.json
restart_docker
fi
if [ "${DOCKER_SWARM_ROLE}" == "worker" ]; then
if [[ "${DOCKER_SWARM_ROLE}" == "manager" ]]; then
docker swarm init --advertise-addr "${DOCKER_SWARM_MANAGER_IP}"
elif [[ "${DOCKER_SWARM_ROLE}" == "worker" ]]; then
docker swarm join --token "${DOCKER_SWARM_TOKEN}" "${DOCKER_SWARM_MANAGER_IP}":2377
else
log_error "未知 Swarm 角色: ${DOCKER_SWARM_ROLE}"
fi
log_info '------------------------------ Docker Swarm 启用完成! ------------------------------'
@@ -916,34 +944,47 @@ while getopts "v:i:d:p:c:n:r:m:t:abs" opt; do
log_info '用户自定义: 启用 Docker Swarm'
;;
r)
## 设置 Docker Swarm 角色
## 设置 Docker Swarm 角色(不隐式开启 Swarm,需显式 -s)
if [[ ${OPTARG} != "manager" && ${OPTARG} != "worker" ]]; then
log_error '角色错误,可选择:manager、worker'
fi
NEED_ENABLE_DOCKER_SWARM=true
DOCKER_SWARM_ROLE="${OPTARG}"
log_info '用户自定义: Docker Swarm 角色('${OPTARG}''
log_info "用户自定义: Docker Swarm 角色(${OPTARG}"
;;
m)
## 设置 Docker Swarm Manager IP
NEED_ENABLE_DOCKER_SWARM=true
## 设置 Docker Swarm Manager IP(不隐式开启 Swarm,需显式 -s)
DOCKER_SWARM_MANAGER_IP="${OPTARG}"
log_info '用户自定义: Docker Swarm Manager IP'${OPTARG}''
log_info "用户自定义: Docker Swarm Manager IP${OPTARG}"
;;
t)
## 设置 Docker Swarm Token
NEED_ENABLE_DOCKER_SWARM=true
## 设置 Docker Swarm Token(不隐式开启 Swarm,需显式 -s)
DOCKER_SWARM_TOKEN="${OPTARG}"
log_info '用户自定义: Docker Swarm Token'${OPTARG}''
log_info "用户自定义: Docker Swarm Token******"
;;
\?)
log_error "未知选项: -${OPTARG}"
;;
:)
log_error "选项 -${OPTARG} 缺少参数值!"
;;
esac
done
# Swarm worker 角色强校验(避免使用默认示例值启动 join 失败)
if [[ "${NEED_ENABLE_DOCKER_SWARM}" == true && "${DOCKER_SWARM_ROLE}" == "worker" ]]; then
if [[ "${DOCKER_SWARM_MANAGER_IP}" == "127.0.0.1" ]]; then
log_error "worker 角色必须通过 -m 指定 manager 节点真实 IP"
fi
if [[ -z "${DOCKER_SWARM_TOKEN}" || "${DOCKER_SWARM_TOKEN}" == "123456" ]]; then
log_error "worker 角色必须通过 -t 指定有效 Swarm Token(默认占位 123456 不可用)!"
fi
fi
# 移除已经使用的参数
shift $((OPTIND-1))
# 根据参数执行方法
case "$@" in
case "${1:-help}" in
help)
help
;;
@@ -960,7 +1001,7 @@ case "$@" in
update
;;
info)
info
info_docker
;;
start)
start_docker
+1 -1
View File
@@ -10,7 +10,7 @@ Type=notify
Environment=PATH={{DOCKER_BIN_DIR}}:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by dockerExecStart={{DOCKER_BIN_DIR}}/dockerd -H unix://var/run/docker.sock
# for containers run by docker
ExecStart={{DOCKER_BIN_DIR}}/dockerd -H unix://var/run/docker.sock
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
Binary file not shown.