Update do_docker.sh

This commit is contained in:
悟空的日常镜像仓库 2024-03-25 20:04:36 +08:00
parent 856dfe3b57
commit 79df3443bd
1 changed files with 136 additions and 213 deletions

View File

@ -1,163 +1,129 @@
#!/bin/sh
red() {
echo -e "\033[31m\033[01m[WARNING] $1\033[0m"
}
green() {
echo -e "\033[32m\033[01m[INFO] $1\033[0m"
}
yellow() {
echo -e "\033[33m\033[01m[NOTICE] $1\033[0m"
}
blue() {
echo -e "\033[34m\033[01m[MESSAGE] $1\033[0m"
}
light_magenta() {
echo -e "\033[95m\033[01m[NOTICE] $1\033[0m"
}
light_yellow() {
echo -e "\033[93m\033[01m[NOTICE] $1\033[0m"
}
##获取路由型号信息
# 定义颜色输出函数
red() { echo -e "\033[31m\033[01m[WARNING] $1\033[0m"; }
green() { echo -e "\033[32m\033[01m[INFO] $1\033[0m"; }
yellow() { echo -e "\033[33m\033[01m[NOTICE] $1\033[0m"; }
blue() { echo -e "\033[34m\033[01m[MESSAGE] $1\033[0m"; }
light_magenta() { echo -e "\033[95m\033[01m[NOTICE] $1\033[0m"; }
light_yellow() { echo -e "\033[93m\033[01m[NOTICE] $1\033[0m"; }
# 获取路由器型号信息
get_router_name() {
model_info=$(cat /tmp/sysinfo/model)
echo "$model_info"
cat /tmp/sysinfo/model
}
# 安装必备工具lsblk和fdisk等
# 安装依赖应用
install_depends_apps() {
blue "正在安装部署环境的所需要的工具 lsblk 和fdisk ..."
router_name=$(get_router_name)
case "$router_name" in
*3000*)
opkg update >/dev/null 2>&1
if opkg install lsblk fdisk >/dev/null 2>&1; then
green "$router_name 的 lsblk fdisk 工具 安装成功。"
else
red "安装失败。"
exit 1
fi
;;
*2500*)
opkg update >/dev/null 2>&1
if opkg install lsblk fdisk >/dev/null 2>&1; then
green "$router_name 的 lsblk fdisk 工具 安装成功。"
else
red "安装失败。"
exit 1
fi
;;
*6000*)
red "由于 mt6000 的软件源中没有找到 lsblk 和fdisk ..."
yellow "因此先借用mt3000的软件源来安装lsblk 和fdisk工具"
# 备份 /etc/opkg/distfeeds.conf
cp /etc/opkg/distfeeds.conf /etc/opkg/distfeeds.conf.backup
# 先替换为mt3000的软件源来安装lsblk 和fdisk工具
mt3000_opkg="https://raw.githubusercontent.com/wukongdaily/gl-inet-onescript/master/mt-3000/distfeeds.conf"
wget -q -O /etc/opkg/distfeeds.conf ${mt3000_opkg}
green "正在更新为mt3000的软件源"
opkg update >/dev/null 2>&1
green "再次尝试安装 lsblk 和fdisk工具"
if opkg install lsblk fdisk >/dev/null 2>&1; then
green "$router_name 的 lsblk fdisk 工具 安装成功。"
#还原软件源
cp /etc/opkg/distfeeds.conf.backup /etc/opkg/distfeeds.conf
else
red "安装失败。"
#还原软件源
cp /etc/opkg/distfeeds.conf.backup /etc/opkg/distfeeds.conf
exit 1
fi
;;
*)
echo "Router name does not contain '3000' 6000 or '2500'."
;;
esac
blue "正在安装 部署docker环境所需的工具 lsblk 和 fdisk..."
local router_name=$(get_router_name)
opkg update >/dev/null 2>&1
if opkg install lsblk fdisk >/dev/null 2>&1; then
green "$router_name 的 lsblk 和 fdisk 工具安装成功。"
else
red "安装失败。"
exit 1
fi
}
# START
install_depends_apps
green "现在开始查找USB设备分区,请稍后......"
# 自动识别第一个可移除的USB磁盘
USB_DISK=$(lsblk -dn -o NAME,RM,TYPE | awk '$2=="1" && $3=="disk" {print "/dev/"$1; exit}')
if [ -z "$USB_DISK" ]; then
echo "未找到USB磁盘。"
exit 1
fi
yellow "找到USB磁盘$USB_DISK"
# 清零磁盘开始部分以清除分区表和文件系统签名
dd if=/dev/zero of=$USB_DISK bs=1M count=10
sync
# 卸载所有与该磁盘相关的挂载点
for mount in $(mount | grep "$USB_DISK" | awk '{print $3}'); do
yellow "正在尝试卸载U盘挂载点$mount"
if ! umount $mount; then
red "警告:无法卸载挂载点 $mount。可能有文件正在被访问或权限不足。"
# 准备USB设备
prepare_usb_device() {
green "现在开始查找USB设备分区请稍后......"
local usb_disk=$(lsblk -dn -o NAME,RM,TYPE | awk '$2=="1" && $3=="disk" {print "/dev/"$1; exit}')
if [ -z "$usb_disk" ]; then
red "未找到USB磁盘。"
exit 1
else
green "U盘挂载点 $mount 卸载成功。"
fi
done
yellow "找到USB磁盘$usb_disk"
red "正在重新分区并格式化$USB_DISK..."
# 使用fdisk清除所有分区并创建一个新的主分区
{
echo o # 创建一个新的空DOS分区表
echo n # 添加一个新分区
echo p # 主分区
echo 1 # 分区号1
echo # 第一个可用扇区(默认)
echo # 最后一个扇区(默认,使用剩余空间)
echo w # 写入并退出
} | fdisk $USB_DISK >/dev/null 2>&1
# 清零磁盘开始部分以清除分区表和文件系统签名
dd if=/dev/zero of=$usb_disk bs=1M count=10
sync
# 等待磁盘分区表更新
sleep 5
# 卸载所有与该磁盘相关的挂载点
unmount_usb_device "$usb_disk"
# 格式化新分区为EXT4文件系统
NEW_PARTITION="${USB_DISK}1"
red "正在将U盘 $NEW_PARTITION 格式化为EXT4文件系统..."
mkfs.ext4 -F $NEW_PARTITION >/dev/null 2>&1
green "$NEW_PARTITION 已成功格式化为EXT4文件系统。"
red "正在重新分区并格式化$usb_disk..."
create_and_format_partition "$usb_disk"
}
# 卸载所有与该磁盘相关的挂载点
for mount in $(mount | grep "$USB_DISK" | awk '{print $3}'); do
echo "再次卸载U盘的自动挂载点$mount"
umount $mount
done
# 卸载USB设备
unmount_usb_device() {
for mount in $(mount | grep "$1" | awk '{print $3}'); do
yellow "正在尝试卸载U盘挂载点$mount"
umount $mount || {
red "警告:无法卸载挂载点 $mount。可能有文件正在被访问或权限不足。"
exit 1
}
green "U盘挂载点 $mount 卸载成功。"
done
}
yellow "为Docker Root 创建挂载点..."
USB_MOUNT_POINT="/mnt/upan_data"
DOCKER_ROOT="$USB_MOUNT_POINT/docker"
mkdir -p $DOCKER_ROOT
# 创建并格式化分区
create_and_format_partition() {
{
echo o # 创建一个新的空DOS分区表
echo n # 添加一个新分区
echo p # 主分区
echo 1 # 分区号1
echo # 第一个可用扇区(默认)
echo # 最后一个扇区(默认,使用剩余空间)
echo w # 写入并退出
} | fdisk $1 >/dev/null 2>&1
green "将U盘 挂载到 $USB_MOUNT_POINT..."
mount -t ext4 $NEW_PARTITION $USB_MOUNT_POINT
# 检查挂载命令的退出状态
if [ $? -ne 0 ]; then
red "挂载失败,脚本退出。"
exit 1
fi
green "U盘挂载成功啦\n"
green "正在创建 Docker 配置文件 /etc/docker/daemon.json"
mkdir -p /etc/docker
echo '{
"bridge": "docker0",
"storage-driver": "overlay2",
"data-root": "'$DOCKER_ROOT'"
}' >/etc/docker/daemon.json
sleep 5
local new_partition="${1}1"
red "正在将U盘 $new_partition 格式化为EXT4文件系统..."
mkfs.ext4 -F $new_partition >/dev/null 2>&1
green "$new_partition 已成功格式化为EXT4文件系统。"
}
# 配置并启动Docker
configure_and_start_docker() {
local new_partition="$1"
local usb_mount_point="/mnt/upan_data"
local docker_root="$usb_mount_point/docker"
mkdir -p $docker_root
green "将U盘 挂载到 $usb_mount_point..."
mount -t ext4 $new_partition $usb_mount_point
if [ $? -ne 0 ]; then
red "挂载失败,脚本退出。"
exit 1
fi
green "U盘挂载成功啦\n"
green "正在创建 Docker 配置文件 /etc/docker/daemon.json"
mkdir -p /etc/docker
echo '{
"bridge": "docker0",
"storage-driver": "overlay2",
"data-root": "'$docker_root'"
}' >/etc/docker/daemon.json
install_docker
configure_docker_to_start_on_boot "$new_partition" "$usb_mount_point"
start_docker_and_check
}
# 安装 Docker 和 dockerd
green "正在更新 OPKG 软件包..."
opkg update >/dev/null 2>&1
green "正在安装 Docker及相关服务...请耐心等待一会...大约需要1分钟\n"
opkg install luci-app-dockerman >/dev/null 2>&1
opkg install luci-i18n-dockerman-zh-cn >/dev/null 2>&1
opkg install dockerd --force-depends >/dev/null 2>&1
install_docker() {
green "正在更新 OPKG 软件包..."
opkg update >/dev/null 2>&1
green "正在安装 Docker 及相关服务...请耐心等待一会...大约需要1分钟\n"
opkg install luci-app-dockerman >/dev/null 2>&1
opkg install luci-i18n-dockerman-zh-cn >/dev/null 2>&1
opkg install dockerd --force-depends >/dev/null 2>&1
}
# 创建并配置启动脚本
green "正在设置 Docker 跟随系统启动的文件:/etc/init.d/docker"
cat <<'EOF' >/etc/init.d/docker
# 配置 Docker 开机启动
configure_docker_to_start_on_boot() {
local new_partition="$1"
local usb_mount_point="$2"
# 创建并配置启动脚本
green "正在设置 Docker 跟随系统启动的文件:/etc/init.d/docker"
cat <<EOF >/etc/init.d/docker
#!/bin/sh /etc/rc.common
START=99
@ -166,7 +132,7 @@ PROG="/usr/bin/dockerd"
start_service() {
procd_open_instance
procd_set_param command $PROG --config-file /etc/docker/daemon.json
procd_set_param command \$PROG --config-file /etc/docker/daemon.json
procd_set_param stdout 1
procd_set_param stderr 1
procd_close_instance
@ -182,77 +148,34 @@ restart() {
}
EOF
# 使启动脚本可执行并启用自启动
chmod +x /etc/init.d/docker
/etc/init.d/docker enable
/etc/init.d/docker start
chmod +x /etc/init.d/docker
/etc/init.d/docker enable
}
green "正在设置开机启动顺序的配置\n\n先挂载U盘,再启动Docker 修改/etc/rc.local后如下\n"
# 首先,备份 /etc/rc.local
cp /etc/rc.local /etc/rc.local.backup
# U盘分区 /dev/sdx=$NEW_PARTITION
# glinet系统重启后的 USB自动挂载点
SYSTEM_USB_AUTO_MOUNTPOINT="/tmp/mountd/disk1_part1"
# 卸载USB自动挂载点 挂载自定义挂载点 /mnt/upan_data
if ! grep -q "umount $SYSTEM_USB_AUTO_MOUNTPOINT" /etc/rc.local; then
sed -i '/exit 0/d' /etc/rc.local
# 将新的命令添加到 /etc/rc.local然后再加上 exit 0
{
echo "umount $SYSTEM_USB_AUTO_MOUNTPOINT || true"
echo "mount $NEW_PARTITION $USB_MOUNT_POINT || true"
echo "/etc/init.d/docker start || true"
echo "exit 0"
} >>/etc/rc.local
fi
cat /etc/rc.local
# 修改 /etc/config/dockerd 文件中的 data_root 配置
sed -i "/option data_root/c\ option data_root '/mnt/upan_data/docker/'" /etc/config/dockerd
# 安装完毕后
green "正在尝试启动Docker....请稍后"
# 初始化计数器
counter=0
# 循环检查 Docker 守护进程是否已经启动
until docker info >/dev/null 2>&1; do
counter=$((counter + 1))
echo "Waiting for Docker daemon to start..."
sleep 1
# 如果等待时间达到10秒则跳出循环
if [ $counter -eq 10 ]; then
echo "Failed to start Docker daemon within 10 seconds."
exit 1
fi
done
/etc/init.d/docker stop
yellow "正在重启Docker 守护进程...."
sleep 2
/etc/init.d/docker start
sleep 5
green "Docker 运行环境部署完毕"
yellow "正在帮您启动Docker....若出现卡住现象 20s都没反应。建议手动重启路由器"
# 检查Docker是否正在运行
if ! docker info >/dev/null 2>&1; then
red "Docker 启动失败,您可以手动启动docker 执行 /etc/init.d/docker start"
else
DOCKER_ROOT_DIR=$(docker info 2>&1 | grep -v "WARNING" | grep "Docker Root Dir" | awk '{print $4}')
light_magenta "当前Docker根目录为: $DOCKER_ROOT_DIR"
light_yellow "Docker根目录剩余空间:$(df -h $DOCKER_ROOT_DIR | awk 'NR==2{print $4}')"
# 检查DOCKER_ROOT_DIR是否为"/opt/docker"
if [ "$DOCKER_ROOT_DIR" = "/opt/docker" ]; then
yellow "虽然Docker启动成功了,但是Docker根目录不正确 $DOCKER_ROOT_DIR 。建议立即重启以修正。"
# 启动 Docker 并检查
start_docker_and_check() {
/etc/init.d/docker start
sleep 5
if ! docker info >/dev/null 2>&1; then
red "Docker 启动失败,您可以手动启动docker 执行 /etc/init.d/docker start"
else
green "Docker启动成功并设置正确,您可以直接使用啦~\n"
light_yellow "不过为了验证下次启动docker的有效性 建议手动重启路由器一次 祝您使用愉快"
green "Docker 启动成功并设置正确,您可以直接使用啦~\n"
DOCKER_ROOT_DIR=$(docker info 2>&1 | grep -v "WARNING" | grep "Docker Root Dir" | awk '{print $4}')
light_magenta "当前Docker根目录为: $DOCKER_ROOT_DIR"
light_yellow "Docker根目录剩余空间:$(df -h $DOCKER_ROOT_DIR | awk 'NR==2{print $4}')"
yellow "不过为了验证下次启动docker的有效性 建议手动重启路由器一次 祝您使用愉快\n"
red "是否立即重启?(y/n)"
read -r answer
if [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then
red "正在重启..."
reboot
else
yellow "您选择了不重启"
fi
fi
echo
red "是否立即重启?(y/n)"
read -r answer
if [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then
red "正在重启..."
reboot
else
yellow "您选择了不重启"
fi
fi
}
# 主执行流程
install_depends_apps
prepare_usb_device
configure_and_start_docker "${USB_DISK}1"