今天手撸了一个docker部署服务脚本,发现用着还行,分享给大家!

今天手撸了一个docker部署服务脚本,发现用着还行,分享给大家!

注意通过Dockerfile构建docker镜像时,输入的文件路径,也是docker build时使用的上下文路径

#!/bin/bash
common_sepearator_title=" 》》》 "
function public_tips() {
    echo "欢迎使用docker部署脚本, 请根据需要输入以下内容"
    # echo "1 通过Dockerfile构建docker镜像"
    # echo "2 运行容器"
    # echo "3 停止容器"
    # echo "4 启动容器"
    # echo "5 重启容器"
    # echo "6 暂停容器"
    # echo "7 容器取消暂停"
    # echo "8 删除镜像"
    # echo "9 删除容器并删除镜像"
    # echo "10 查看所有运行容器"
    # echo "11 查看所有容器,包括未运行的容器"

    # printf "%-35s%-35s%-35s\n" "1 构建docker镜像" "2 运行容器" "3 停止容器"
    # printf "%-35s%-35s%-35s\n" "4 启动容器" "5 重启容器" "6 暂停容器"
    # printf "%-35s%-35s%-35s\n" "7 容器取消暂停" "8 删除镜像" "9 删除容器并删除镜像"
    # printf "%-35s%-35s%-35s\n" "10 查看所有运行容器" "11 查看所有容器,包括未运行的容器" ""
    
    cat << 'EOF' | column -t -s $'\t'
1)  构建jar docker镜像           2)  运行容器            3)  停止容器
4)  启动容器                     5)  重启容器            6)  暂停容器
7)  容器取消暂停                  8)  删除镜像            9)  删除容器并删除镜像
10) 查看所有运行容器              11) 查看所有容器,包括未运行的容器
12) 构建war docker镜像 
EOF
}

function exit_shell() {
    echo "监测到您未输入任何数据, 退出脚本"
    exit 1
}
function str_input_parameter_exist() {
    if [ -z "$1" ]; then
        exit_shell
    fi
}
function determine_previous_command_exec_status() {
    if [ $? != 0 ]; then
    echo "++++++++++++++++++++++++++++ $1 ++++++++++++++++++++++++++"
    exit 1
fi
}
function generate_dockerfile() {
    echo "+++++++++++++++++++++++++++开始生成Dockerfile++++++++++++++++++++++++++"
    str_input_parameter_exist "$1"
    local file_path="$1"
    str_input_parameter_exist "$2"
    local image_name="$2"
    local dockerfile_path="$file_path/Dockerfile"
if [ "$3" = "jar" ];then
    local jar_files=($(ls "$file_path" | grep "\.jar$"))
    local jar_name=$(basename "${jar_files[0]}")
cat << EOF > "$dockerfile_path"
FROM openjdk:24-jdk-oracle
LABEL MAINTAINER="sochina wrathfist"
WORKDIR /app
ADD ./ ./
ENTRYPOINT ["java","-Dfile.encoding=utf-8","-jar","/app/$jar_name"]
EOF
else
    local war_files=($(ls "$file_path" | grep "\.war$"))
    local war_name=$(basename "{war_files[0]}")
    mkdir "$file_path/app"
    unzip "$file_path/$war_name" -d "$file_path/app"
cat << EOF > "$dockerfile_path"
FROM tomcat:11.0.10-jdk21-temurin-noble
LABEL MAINTAINER="sochina wrathfist"
ENV ROOT_PATH /usr/local/tomcat/webapps/
WORKDIR $ROOT_PATH
RUN rm -rf ./*
ADD ./app ./
# ADD "./$war_name" ./app.war
# RUN apt --fix-broken install
# RUN apt-get update
# RUN apt-get install unzip
# RUN mkdir app
# RUN unzip ./app.war -d ./app
EXPOSE 8080
CMD ["../bin/catalina.sh","run"]
EOF
fi
    determine_previous_command_exec_status "Dockerfile生成失败"
    echo "+++++++++++++++++++++++++++Dockerfile生成成功  +++++++++++++++++++++++++++++++++++++++++"
    echo "+++++++++++++++++++++++++++开始构建docker image+++++++++++++++++++++++++++++++++++++++++"
    docker build -f "$dockerfile_path" -t "$image_name" "$file_path"
    determine_previous_command_exec_status "docker image构建失败"
    echo "+++++++++++++++++++++++++++docker image构建成功+++++++++++++++++++++++++++++++++++++++++"
}

function build_image_by_dockerfile() {
    local file_path
    local image_name
    echo "通过Dockerfile构建docker镜像"
    read -ep "请输入文件路径(jar和配置文件所在目录,docker build编译时也是设置该目录) $common_sepearator_title" file_path
    str_input_parameter_exist "$file_path"
    echo "输入的文件路径是 $file_path"
    read -ep "请输入镜像名,格式:image_name:image_tag $common_sepearator_title" image_name;
    str_input_parameter_exist "$image_name"
    echo "输入的镜像名是 $image_name"
    generate_dockerfile "$file_path" "$image_name" "$1"
    docker images "$image_name"
}

function stop_delete_container_and_delete_image() {
    local container_name
    echo "停止、删除容器并删除镜像"
    read -ep "请输入要删除的容器名 $common_sepearator_title" container_name;
    str_input_parameter_exist "$container_name"
    echo "输入的容器名是$common_sepearator_title$container_name"
    image=$(docker ps -f "name=$container_name"|awk '{print $2}')
    docker ps -f "name=$container_name"|awk '{print $1}'|xargs docker stop|xargs docker rm
    determine_previous_command_exec_status "停止、删除容器$common_sepearator_title$container_name $common_sepearator_title失败"
    echo "停止、删除容器$common_sepearator_title$container_name $common_sepearator_title成功"
    docker rmi "$image" 
    determine_previous_command_exec_status "删除镜像 $common_sepearator_title$image 失败"
    echo "删除镜像 $common_sepearator_title$image $common_sepearator_title成功"
}

function run_container() {
    local image_name
    local ports ports_input
    local volumes volumes_input
    local other_options
    local container_name 
    read -ep "请输入映射端口号,格式:port1:port1 port2:port2,中间空格分隔$common_sepearator_title" ports_input;
    local exec_command="docker run -itd "
    eval "ports=($ports_input)"
    if [ ${#ports[*]} -eq 0 ]; then
  
        echo "没有接收到需要映射的端口号"
    else
        echo "需要映射的端口号 $common_sepearator_title${ports[*]}"
        for port in "${ports[@]}";
        do 
            echo "要映射的端口数组元素 $port"
            exec_command="$exec_command -p $port"
        done 
        echo "拼接完映射端口号的docker执行命令$common_sepearator_title$exec_command"
    fi
    determine_previous_command_exec_status "运行容器时,拼接映射端口号时,发生未知错误"
    read -ep "请输入要挂载的目录卷,格式:volume1:volume1 volume2:volume2 ,中间空格分隔$common_sepearator_title" volumes_input;
    eval "volumes=($volumes_input)"
    if [ ${#volumes[*]} -eq 0 ]; then
        echo "没有接收到需要挂载的目录卷"
    else 
        echo "需要挂载的目录卷 $common_sepearator_title${volumes[*]}"
        for volume in "${volumes[@]}";
        do 
            echo "需要挂载的目录卷数组元素 $volume"
            exec_command="$exec_command -v $volume"
        done
        echo "拼接完挂载目录卷的docker执行命令$common_sepearator_title$exec_command"
    fi 
    determine_previous_command_exec_status "运行容器时,拼接挂载目录卷时,发生未知错误"
    read -ep "请输入运行容器名称$common_sepearator_title" container_name;
    str_input_parameter_exist "$container_name"
    exec_command="$exec_command --name $container_name"
    echo "拼接容器名称后的运行容器命令$common_sepearator_title$exec_command"
    read -ep "请输入镜像名称,格式: image_name:image_tag$common_sepearator_title" image_name;
    str_input_parameter_exist "$image_name"
    exec_command="$exec_command $image_name"
    echo "拼接镜像名称后的容器运行命令 $exec_command"
    read -ep "请输入其它运行容器参数,例如:-e name=wrathfist -e orgName=sochina 18080 --restart always localhost:21050 ,中间空格分隔 $common_sepearator_title" other_options;
    # if [ "$other_options" ]; then
    #     exec_command="$exec_command $other_options"
    #     echo "拼接完其它运行容器的选项docker执行命令$common_sepearator_title$exec_command"
    # else 
    #     echo "没有接收到运行容器的其他选项,例如:环境变量"
    # fi
    str_input_parameter_exist "$other_options"
    exec_command="$exec_command $other_options"
    echo "拼接完其它运行容器的选项docker执行命令$common_sepearator_title$exec_command"
    echo "最终执行命令$common_sepearator_title$exec_command"
    eval "$exec_command"
    determine_previous_command_exec_status "运行容器$common_sepearator_title$container_name 发生未知异常"
    echo "运行容器$common_sepearator_title$container_name 成功"
}

function restart_container() {
    local container_name
    local common_title="重启容器 $common_sepearator_title"
    read -ep "请输入要$common_title " container_name;
    str_input_parameter_exist "$container_name"
    docker restart "$container_name"
    determine_previous_command_exec_status "$common_title $container_name 发生未知异常"
    echo "$common_title $container_name 成功"
}

function pause_container() {
    local container_name
    local common_title="暂停容器 $common_sepearator_title"
    read -ep "请输入要$common_title " container_name;
    str_input_parameter_exist "$container_name"
    docker pause "$container_name"
    determine_previous_command_exec_status "$common_title $container_name 发生未知异常"
    echo "$common_title $container_name 成功"
}

function unpause_container() {
    local container_name
    local common_title="取消暂停容器 $common_sepearator_title"
    read -ep "请输入要$common_title " container_name;
    str_input_parameter_exist "$container_name"
    docker unpause "$container_name"
    determine_previous_command_exec_status "$common_title $container_name 发生未知异常"
    echo "$common_title $container_name 成功"
}

function stop_container() {
    local container_name
    local common_title="停止容器 $common_sepearator_title"
    read -ep "请输入要$common_title " container_name;
    str_input_parameter_exist "$container_name"
    docker stop "$container_name"
    determine_previous_command_exec_status "$common_title $container_name 发生未知异常"
    echo "$common_title $container_name 成功"
}

function delete_image() {
    local image_name
    local common_title="删除镜像 $common_sepearator_title"
    read -ep "请输入要$common_title " image_name;
    str_input_parameter_exist "$image_name"
    docker rmi "$image_name"
    determine_previous_command_exec_status "$common_title $image_name 发生未知异常"
    echo "$common_title $image_name 成功"
}

function start_container() {
    local container_name
    local common_title="容器启动 $common_sepearator_title"
    read -ep "请输入要$common_title " container_name;
    str_input_parameter_exist "$container_name"
    docker stop "$container_name"
    determine_previous_command_exec_status "$common_title $container_name 发生未知异常"
    echo "$common_title $container_name 成功"
}

function determine_docker_install() {
    if command -v docker &> /dev/null; then
        echo "检测到docker已安装"
    else
        echo "检测到docker未安装"
        exit 1
    fi
}

# 判断docker服务是否启动
function determine_docker_start() {
    if systemctl is-active docker &> /dev/null; then
        echo "检测到docker服务已经启动"
    else 
        echo "检测到docker服务未启动"
        local start_docker
        read -ep "是否尝试启动docker服务,请输入y/Y/n" start_docker;
        if [ "$start_docker" = "y" ] || [ "$start_docker" = "Y" ]; then
            echo "尝试启动docker服务"
            systemctl start docker
            determine_previous_command_exec_status "尝试启动docker服务发生异常"
        else
            echo "未选择尝试启动docker服务,将退出脚本"
            exit 1 
        fi
    fi
} 

function determine_docker_available() {
    if docker --version &> /dev/null; then
        echo "检测到docker服务可用"
    else
        echo "检测到docker服务不可用,请检查docker服务状态"
        exit 1
    fi
}

function determine_docker_compose_exist() {
    if ! docker compose --version &> /dev/null && ! docker compose &> /dev/null ; then
        echo "检测到docker compose未安装或者出现异常,请检查docker compose是否安装,或者能否正常使用docker compose"
        exit 1
    fi
}

function run_main() {
    public_tips
    if read -ep "请输入对应选项数字:$common_sepearator_title" option;
    then
        case $option in
            1) 
                build_image_by_dockerfile "jar"
                ;;
            2) 
                run_container
                ;;
            3)
                stop_container
                ;;
            4)
                start_container
                ;;
            5) 
                restart_container
                ;;
            6)
                pause_container
                ;;
            7)
                unpause_container
                ;;
            8) 
                delete_image
                ;;
            9) 
                stop_delete_container_and_delete_image
                ;;
            10) echo "++++++++++++++所有运行容器信息++++++++++++++"
                docker ps
                ;;
            11) echo "+++++++++++++所有容器信息++++++++++++++++++"
                docker ps -a
                ;;
            12)
                build_image_by_dockerfile "war"
                ;;
            *)
                echo "未检测到符合要求的输入选项,退出脚本"
                exit 1
                ;;
        esac
        run_main
    else
        exit_shell
    fi
}

determine_docker_install
determine_docker_start
determine_docker_available
run_main
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迷途的家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值