From 36e83a6197c142c4416ff29614c412cb83890b06 Mon Sep 17 00:00:00 2001 From: huty <huty@hty1024.com> Date: Mon, 24 Mar 2025 10:49:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0docker-tools=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=EF=BC=9B=E6=96=B0=E5=A2=9Edocker-tools=5Fv1.1.0.zip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-tools/docker-tools | 134 ++++++++++++++++++++++++++++--- releases/docker-tools_v1.1.0.zip | Bin 0 -> 5719 bytes 2 files changed, 123 insertions(+), 11 deletions(-) create mode 100644 releases/docker-tools_v1.1.0.zip diff --git a/docker-tools/docker-tools b/docker-tools/docker-tools index 8f81daa..1ece29e 100755 --- a/docker-tools/docker-tools +++ b/docker-tools/docker-tools @@ -4,7 +4,7 @@ # 参数配置 ## 版本号 -VERSION=1.0.0 +VERSION=1.1.0 ## 当前的日期、日期时间 DATE=`date +%Y%m%d` DATETIME=`date +%Y%m%d`_`date +%H%M%S` @@ -19,11 +19,11 @@ NEED_OFFLINE_INSTALL=false ## 是否安装 Docker Engine NEED_INSTALL_ENGINE=true ## Docker 版本号 -DOCKER_VERSION=28.0.1 +DOCKER_VERSION=28.0.2 ## Docker 安装包下载地址(在线安装时使用) DOCKER_PACKAGE_URL=https://download.docker.com/linux/static/stable ## Docker 安装包名称(离线安装时使用) -DOCKER_PACKAGE_NAME=docker-28.0.1.tgz +DOCKER_PACKAGE_NAME=docker-28.0.2.tgz ## 是否安装 Docker Compose NEED_INSTALL_COMPOSE=true ## Docker Compose 版本号 @@ -159,7 +159,7 @@ downloadDockerEnginePackage () { echo '------------------------------ 开始下载 Docker 安装包... ------------------------------' wget $DOCKER_PACKAGE_URL/$CPU_ARCH/docker-$DOCKER_VERSION.tgz - $DOCKER_PACKAGE_NAME=docker-$DOCKER_VERSION.tgz + DOCKER_PACKAGE_NAME=docker-$DOCKER_VERSION.tgz echo '------------------------------ Docker 安装包下载完成! ------------------------------' } @@ -178,7 +178,7 @@ downloadDockerComposePackage () { echo '------------------------------ 开始下载 Docker Compose 安装包... ------------------------------' wget $DOCKER_COMPOSE_PACKAGE_URL/$DOCKER_COMPOSE_VERSION/docker-compose-linux-$CPU_ARCH - $DOCKER_COMPOSE_PACKAGE_NAME=docker-compose-linux-$CPU_ARCH + DOCKER_COMPOSE_PACKAGE_NAME=docker-compose-linux-$CPU_ARCH echo '------------------------------ Docker Compose 安装包下载完成! ------------------------------' } @@ -201,28 +201,48 @@ installDockerEngine () { echo '------------------------------ Docker Engine 安装完成! ------------------------------' } +## 备份当前 Docker Engine () { +backupDockerEngine () { + echo '------------------------------ 开始备份 Docker Engine... ------------------------------' + + cp -rpf $DOCKER_INSTALL_DIR $DOCKER_INSTALL_DIR'_bak_'$DATETIME + + echo '------------------------------ Docker Engine 备份完成! ------------------------------' +} + ## 安装 Dokcer Compose installDockerCompose () { echo '------------------------------ 开始安装 Docker Compose... ------------------------------' cp -rpf ./$DOCKER_COMPOSE_PACKAGE_NAME $DOCKER_INSTALL_DIR/docker-compose + chown docker.docker $DOCKER_INSTALL_DIR/docker-compose chmod +x $DOCKER_INSTALL_DIR/docker-compose echo '------------------------------ Docker Compose 安装完成! ------------------------------' } +## 备份当前 Docker Coimpose +backupDockerCompose () { + echo '------------------------------ 开始备份 Docker Compose... ------------------------------' + + mkdir -pv $DOCKER_INSTALL_DIR'_bak_'$DATETIME + cp -rpf $DOCKER_INSTALL_DIR/docker-compose $DOCKER_INSTALL_DIR'_bak_'$DATETIME/docker-compose + + echo '------------------------------ Docker Compose 备份完成! ------------------------------' +} + ## 配置环境变量 configEnv () { echo '------------------------------ 开始配置环境变量... ------------------------------' - cp -rpf ~/.bashrc ~/.bashrc.bak.$DATE + cp -rpf ~/.bashrc ~/.bashrc.bak.$DATETIME 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 - cp -rpf /etc/profile /etc/profile.bak.$DATE + cp -rpf /etc/profile /etc/profile.bak.$DATETIME echo '# Docker Env Begin' >> /etc/profile echo 'export DOCKER_HOME='$DOCKER_INSTALL_DIR >> /etc/profile echo 'export PATH=$PATH:$DOCKER_HOME' >> /etc/profile @@ -236,14 +256,14 @@ configEnv () { removeEnv () { echo '------------------------------ 开始移除环境变量... ------------------------------' - cp -rpf ~/.bashrc ~/.bashrc.bak.$DATE + cp -rpf ~/.bashrc ~/.bashrc.bak.$DATETIME 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 - cp -rpf /etc/profile /etc/profile.bak.$DATE + cp -rpf /etc/profile /etc/profile.bak.$DATETIME 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 @@ -283,9 +303,9 @@ configDockerEngine () { cp -rpf daemon.json /etc/docker/daemon.json sed -i 's#{{DOCKER_DATA_DIR}}#'$DOCKER_DATA_DIR'#g' /etc/docker/daemon.json - chmod -R docker.docker $DOCKER_INSTALL_DIR + chown -R docker.docker $DOCKER_INSTALL_DIR chmod -R 755 $DOCKER_INSTALL_DIR - chmod -R docker.docker $DOCKER_DATA_DIR + chown -R docker.docker $DOCKER_DATA_DIR hmod -R 755 $DOCKER_DATA_DIR echo '------------------------------ Docker 配置完成! ------------------------------' @@ -379,6 +399,43 @@ onlyInstallDockerCompose () { echo '------------------------------ Docker Conpose 安装完成! ------------------------------' } +## 更新 Dokcer Engine +onlyUpdateDockerEngine () { + echo '------------------------------ 开始更新 Docker Engine... ------------------------------' + + searchCPUArch + if [ $NEED_OFFLINE_INSTALL == "false" ];then + downloadDockerEnginePackage + fi + disableDocker + stopDocker + backupDockerEngine + installDockerEngine + startDocker + if [ $NEED_ENABLE_DOCKER == "true" ];then + enableDocker + fi + infoDocker + + echo '------------------------------ Docker Engine 更新完成! ------------------------------' +} + +## 更新 Dokcer Compose +onlyUpdateDockerCompose () { + echo '------------------------------ 开始更新 Docker Compose... ------------------------------' + + searchCPUArch + if [ $NEED_OFFLINE_INSTALL == "false" ]; then + downloadDockerComposePackage + fi + backupDockerCompose + installDockerCompose + restartDocker + infoDocker + + echo '------------------------------ Docker Conpose 更新完成! ------------------------------' +} + ## 安装 Docker install () { echo '====================================================================================================' @@ -435,6 +492,9 @@ uninstall () { echo `date +%Y-%m-%d` `date +%H:%M:%S` echo '============================== 开始卸载 Docker ...... ==============================' + echo '删除目录如下 :' + echo 'Docker 安装目录 : '$DOCKER_INSTALL_DIR + echo 'Docker 数据目录 : '$DOCKER_DATA_DIR echo '此操作将会卸载 Docker 服务,并删除所有文件(包含 Docker 程序文件、镜像、容器文件等),请确认是否卸载(Y:卸载,N:不卸载,E:退出):' read NEED_DELETE case $NEED_DELETE in @@ -465,6 +525,55 @@ uninstall () { echo '====================================================================================================' } +## 更新 Docker +update () { + echo '====================================================================================================' + echo `date +%Y-%m-%d` `date +%H:%M:%S` + echo '============================== 开始更新 Docker ...... ==============================' + + echo '更新参数如下 :' + echo 'CPU 架构 : '$CPU_ARCH + echo 'Docker 安装目录 : '$DOCKER_INSTALL_DIR + echo 'Docker 数据目录 : '$DOCKER_DATA_DIR + echo '是否离线安装 : '$NEED_OFFLINE_INSTALL + echo '是否安装 Docker Engine : '$NEED_INSTALL_ENGINE + echo 'Docker Engine 版本 : '$DOCKER_VERSION + echo 'Docker Engine 安装包下载地址(在线安装时使用): '$DOCKER_PACKAGE_URL + echo 'Docker Engine 安装包名称(离线安装时使用) : '$DOCKER_PACKAGE_NAME + echo '是否安装 Docker Compose : '$NEED_INSTALL_COMPOSE + echo 'Docker Compose 版本 : '$DOCKER_COMPOSE_VERSION + echo 'Docker Compose 安装包下载地址(在线安装时使用) : '$DOCKER_COMPOSE_PACKAGE_URL + echo 'Docker Compose 安装包名称(离线安装时使用) : '$DOCKER_COMPOSE_PACKAGE_NAME + echo '是否开机自动启动: '$NEED_ENABLE_DOCKER + echo '此操作将会更新当前 Docker 版本,存在一定风险,请确认是否更新(Y:更新,N:不更新,E:退出):' + read NEED_UPDATE + case $NEED_UPDATE in + Y) + if [ $NEED_INSTALL_ENGINE == "true" ]; then + onlyUpdateDockerEngine + fi + if [ $NEED_INSTALL_COMPOSE == 'true' ]; then + onlyUpdateDockerCompose + fi + ;; + N) + echo '取消更新。' + ;; + E) + echo '退出更新。' + exit 1 + ;; + *) + echo '参数错误。' + exit 1 + ;; + esac + + echo '============================== Docker 更新完成!!! ==============================' + echo `date +%Y-%m-%d` `date +%H:%M:%S` + echo '====================================================================================================' +} + # 初始化选项 echo $@ @@ -534,6 +643,9 @@ case $@ in uninstall) uninstall ;; + update) + update + ;; info) info ;; diff --git a/releases/docker-tools_v1.1.0.zip b/releases/docker-tools_v1.1.0.zip new file mode 100644 index 0000000000000000000000000000000000000000..c6ff6e1e77e841f5b08d6a2d4e5817997f32493f GIT binary patch literal 5719 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 H1mOPw><Lsd literal 0 HcmV?d00001