首页 > 其他分享 >docker容器操作脚本

docker容器操作脚本

时间:2024-07-25 09:09:13浏览次数:14  
标签:脚本 容器 arr name NC echo status docker id

# 1. 创建目录
cd $HOME && mkdir -P .mine/bin && cd .mine/bin && touch d-use
gedit d-use # 将下面内容复制到d-use中
#2. 加入环境变量
vim ~/.bashrc
export PATH=.mine/bin:$PATH #将.mine/bin目录加入环境变量
source ~/.bashrc
# 然后就可以使用d-use 命令
d-use 容器号/容器名 #(不用全部名称,唯一前缀就行)
d-use # 也可以直接使用d-use
#!/bin/bash

# ANSI颜色代码
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
RED='\033[0;31m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
SKY_BLUE='\033[0;36m'
NC='\033[0m' # 恢复默认颜色

# 获取所有容器ID
c_ids=$(docker ps -aq)

c_id_arr=()
c_name_arr=()
c_status_arr=()

id_max_len=0
name_max_len=0
status_max_len=0
idx=0

echo -e "${PURPLE}[Tip] 当前版本命令仅支持对[0-9]编号的容器操作(删除操作除外)${NC}"

# 遍历每个容器ID,获取容器信息
for id in $c_ids; do
    c_name=$(docker inspect --format='{{.Name}}' $id | sed 's/^\///')
    c_status=$(docker inspect --format='{{.State.Status}}' $id)

    c_id_arr[idx]=$id
    c_name_arr[idx]=$c_name
    c_status_arr[idx]=$c_status
    ((idx++))

    c_name_len=${#c_name}
    c_status_len=${#c_status}

    if [ $name_max_len -lt $c_name_len ]; then
        name_max_len=$c_name_len
    fi
    if [ $status_max_len -lt $c_status_len ]; then
        status_max_len=$c_status_len
    fi
done

choose_num=-1
c_count=0
if [ $# -eq 1 ]; then
    arg1=$1
    
    # 遍历id
    for ((i=0; i < idx; i++)); do
        val1="${c_id_arr[$i]}"
        if [[ "$val1" == "$arg1"* ]]; then
            choose_num=$i
            ((c_count++))
        fi
    done
    if [ $c_count -gt 1 ]; then
        echo -e "${GREEN}>${NC} ${RED}存在多个容器与${NC}${YELLOW} [${arg1}]${NC} ${RED}匹配!${NC}"
        exit
    elif [ $c_count -eq 0 ]; then
        # 变量名字
        for ((i=0; i < idx; i++)); do
            val1="${c_name_arr[$i]}"
            if [[ "$val1" == "$arg1"* ]]; then
                #echo "$val1=$arg1"
                choose_num=$i
                ((c_count++))
            fi
        done
        if [[ $choose_num -eq -1 ]]; then
            echo -e "${GREEN}>${NC} ${RED}选择的容器[$arg1]不存在!${NC}"
        fi
    fi

fi

while [ $choose_num -lt 0 ]; do
    echo -e "${GREEN}>${NC} 请输入需要操作的容器编号${SKY_BLUE}(按 [q] 退出,按 [d] 进入容器删除):${NC}"
    # 打印容器列表
    for ((i=0; i < idx; i++)); do
        
        id_str="${c_id_arr[i]}"
        
        # name
        arr_len=${#c_name_arr[i]}
        num=$((name_max_len-$arr_len))
        spaces_string=$(printf '%*s' $num '')
        name_str="${c_name_arr[i]}$spaces_string"

        # status
        arr_len=${#c_status_arr[i]}
        num=$((status_max_len-$arr_len))
        spaces_string=$(printf '%*s' $num '')
        status_str="${c_status_arr[i]}$spaces_string"

        # final
        echo -e "${YELLOW}[$i] $id_str   $name_str   $status_str${NC}"
    done

    read -n 1 user_input
    echo ""
    if [ "$user_input" == "q" ]; then
        exit
    fi

    # 删除容器操作
    if [ "$user_input" == "d" ]; then
        echo -e "${GREEN}>${NC} 请选择需要删除的容器的编号, 以空格分隔:"
        read -r delete_str
        IFS=' ' read -r -a delete_array <<< "$delete_str"
        
        # 检测输入值是否合法
        for item in "${delete_array[@]}"; do
            # 判断编号合法性
            if [[ $item =~ ^[0-9]+$ ]]; then
                if ((item < 0 || item >= idx)); then
                    echo -e "${GREEN}>${NC} ${RED}输入编号${NC} ${YELLOW}[${item}]${NC} ${RED}超出范围!${NC}"
                    exit
                fi
            else
                echo -e "${GREEN}>${NC} ${RED}输入编号${NC} ${YELLOW}[${item}]${NC} ${RED}非数字!${NC}"
                exit
            fi

        done
        # 打印待删除的容器列表
        echo -e "${GREEN}>${NC} 你要删除的容器如下:"
        for item in "${delete_array[@]}"; do
            echo -e "容器名: ${YELLOW}[${c_name_arr[$item]}]${NC} ID: ${YELLOW}[${c_id_arr[$item]}]${NC}"
        done
        while true; do
            echo -e "${GREEN}>${NC} ${RED}确定删除以上容器?${NC}, ${SKY_BLUE}按 [y] 确认,按 [q] 取消并退出${NC}"
            read -n 1 ret
            if [ "$ret" == "q" ]; then
                exit
            elif [ "$ret" == 'y' ]; then
                for item in "${delete_array[@]}"; do
                    docker stop ${c_name_arr[$item]} && docker rm ${c_name_arr[$item]}
                done 
                echo -e "${GREEN}>${NC} 删除完成"
                exit
            fi
            echo -e "${GREEN}>${NC} ${RED}输入非法命令,请重新输入!${NC}"
        done
    fi

    if ! [[ $user_input =~ ^[0-9]+$ ]]; then
        echo -e "${GREEN}>${NC} ${RED}输入不合法, 请重新输入!${NC}"
    elif [ $user_input -ge 0 ] && [ $user_input -lt $idx ]; then
        choose_num=$user_input
        break
    else
        echo -e "${GREEN}>${NC} ${RED}输入序号不合法,请重新输入!${NC}"
    fi
    echo ""
done

choose_id=${c_id_arr[$choose_num]}
choose_name=${c_name_arr[$choose_num]}
choose_status=${c_status_arr[$choose_num]}

while true
do
    echo -e "${GREEN}>${NC} 请选择对 ${GREEN}[$choose_name]${NC} $choose_id 的操作-> ${SKY_BLUE}进入(e) 重启(r) 关闭(c) 退出(q):${NC}"
    read -n 1 c_opt
    echo ""
    if [ "$c_opt" == "q" ]; then
        exit
    elif [ "$c_opt" == "e" ]; then
        if [ "$choose_status" == "exited" ]; then
            docker start $choose_id
        fi
        docker exec -it $choose_id /bin/bash
        break
    elif [ "$c_opt" == "r" ]; then
        docker restart $choose_id
        break
    elif [ "$c_opt" == "c" ]; then
        docker stop $choose_id
        break
    else
        echo -e "${GREEN}>${NC} ${RED}输入非法指令,请重新输入${NC}"
    fi
done

标签:脚本,容器,arr,name,NC,echo,status,docker,id
From: https://www.cnblogs.com/aliving/p/18322212

相关文章

  • Docker常用命令
    容器打包成镜像#--pause=false表示不暂停容器打包#--pause=true或者默认表示暂停容器打包dockercommit-a"作者"-m"说明"--pause=false容器ID或容器名镜像名:版本打包到文件dockersave-o路径/文件名.tar镜像名:版本推荐几款学习编程的免费平台免费......
  • Windows 任务计划程序:在不打开窗口的情况下运行 .py 脚本
    我被要求从Windows任务计划程序运行一个python脚本。在我的python脚本中,我将大量使用看门狗库来实例化并运行一个观察者,该观察者将监视特定目录路径中的文件更改file_handlers.pyimporttimeimportloggingfromwatchdog.observersimportObserverfro......
  • 用于打印脚本输出的 Python 实用程序
    我可以发誓有一个实用程序可以打印一个python脚本,其输出交织在一起。例如,给定一个脚本:a=2b=3print(a+b)print(a*b)该实用程序将输出a=2b=3print(a+b)#>5print(a*b)#>6有人知道该实用程序的名称吗?我最难找到它。谢谢你!描述的实用程序没有标......
  • Docker简单使用、常用基础命令
    Docker简单使用、常用基础命令运行一个容器,输出helloworlddockerrunubuntu:laster/bin/echo"helloworld"docker:Docker的执行文件run:Docker的一个参数,作用是运行一个容器ubuntu:laster:指定要运行的镜像及版本,本地有直接运行,没有从镜像仓库下载运行/bin/echo"hello......
  • docker介绍、安装
    Docker是什么Docker是一个开源应用容器引擎Docker是完全使用沙箱机制(类似iPhone的app)Docker容器性能开销极低Docker能干什么用于Web应用的自动化打包和发布在服务器部署应用类似于在沙箱中运行应用linux系统中能做的,都可以做到Docker架构镜像:自我理解为类似于一个......
  • docker 启动各类软件
    docker启动redisdockerrun\-d\--nameredis\-p6379:6379\--restartunless-stopped\-v/home/redis/data:/data\-v/home/redis/conf/redis.conf:/etc/redis/redis.conf\redis:latest\redis-server/etc/redis/redis.conf参数说......
  • docker安装细节
    一、docker安装使用环境CentOS7一、必须关闭防火墙和SElinux安全控制软件1.关闭防火墙systemctlstopfirewalld.service2.禁止防火墙开机启动systemctldisablefirewalld.service3.修改SElinux的配置文件vi/etc/selinux/config4.重启reboot5.查看防火墙......
  • JVM 内存结构、垃圾回收机制与并发容器
    目录一、JVM内存结构 1.程序计数器(ProgramCounterRegister): 2.Java虚拟机栈(JVMStack): 3.本地方法栈(NativeMethodStack): 4.堆(Heap): 5.方法区(MethodArea):二、垃圾回收机制 1.标记-清除算法: 2.复制算法: 3.标记-整理算法: 4.分代收集:三、并发容器......
  • 1. Docker的介绍和安装 (二)
    5Docker的原理5.1NamespaceNamespace(命名空间)提供了一个独立的工作环境,Docker使用Namespace来隔离容器,使得每个容器都有自己独立的系统资源(如进程ID、主机名、网络等)。PIDNamespace:隔离进程ID,保证每个容器有独立的进程树。NETNamespace:隔离网络资源,使每个容器有独立......
  • 1. Docker的介绍和安装(一)
    1什么是DockerDocker是一个开源的应用容器引擎,旨在简化应用的开发、交付和运行。通过容器技术,Docker能够将应用及其依赖打包在一个轻量级、可移植的容器中,确保应用在不同环境中的一致性和可靠性。2Docker的历史与背景Docker由SolomonHykes于2013年推出,旨在简化应用的......