今天手撸了一个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

被折叠的 条评论
为什么被折叠?



