docs/server.sh

140 lines
3.2 KiB
Bash
Executable File

#!/bin/bash
# 加载 .env 文件里的变量
export $(grep -v '^#' .env | xargs)
# 函数:检查容器是否存在并返回状态
check_container() {
if [ "$(docker ps -q -f name=$CONTAINER_NAME)" ]; then
return 0 # 容器正在运行
elif [ "$(docker ps -aq -f name=$CONTAINER_NAME)" ]; then
return 1 # 容器存在但未运行
else
return 2 # 容器不存在
fi
}
# 函数:检查镜像是否存在并返回状态
check_image() {
if [ "$(docker images -q $IMAGE_NAME:$IMAGE_TAG)" ]; then
return 0 # 镜像存在
else
return 1 # 镜像不存在
fi
}
# 函数:启动容器
start_container() {
check_container
case $? in
0)
echo "容器 $CONTAINER_NAME 已存在并正在运行。"
;;
1)
echo "容器 $CONTAINER_NAME 已存在,但未运行,尝试启动..."
docker start $CONTAINER_NAME
if [ $? -eq 0 ]; then
echo "容器 $CONTAINER_NAME 已启动。"
else
echo "启动容器 $CONTAINER_NAME 失败。"
exit 1
fi
;;
2)
echo "容器 $CONTAINER_NAME 不存在,检查镜像..."
check_image
if [ $? -ne 0 ]; then
echo "镜像不存在: $IMAGE_NAME:$IMAGE_TAG,开始构建镜像..."
./build.sh
if [ $? -ne 0 ]; then
echo "镜像构建失败,终止操作。"
exit 1
fi
else
echo "镜像已存在: $IMAGE_NAME:$IMAGE_TAG,直接启动容器。"
fi
echo "启动新的容器..."
docker run -d --restart always --name $CONTAINER_NAME -p $HOST_PORT:$CONTAINER_PORT $IMAGE_NAME:$IMAGE_TAG
if [ $? -eq 0 ]; then
echo "容器 $CONTAINER_NAME 已启动,已映射 $HOST_PORT 端口。"
else
echo "启动容器 $CONTAINER_NAME 失败,请检查错误信息。"
exit 1
fi
;;
esac
}
# 函数:停止并删除容器
stop_container() {
if check_container; then
echo "停止并删除容器 $CONTAINER_NAME..."
docker stop $CONTAINER_NAME
docker rm $CONTAINER_NAME
echo "容器 $CONTAINER_NAME 已停止并删除。"
else
echo "容器 $CONTAINER_NAME 不存在。"
fi
}
# 函数:清理容器和所有同名镜像
clear_container() {
read -p "你确定要清理容器 $CONTAINER_NAME 和所有同名镜像吗?(y/n): " choice
if [[ "$choice" != "y" ]]; then
echo "清理操作已取消。"
return
fi
stop_container
echo "删除所有同名镜像..."
OLD_IMAGES=$(docker images --filter=reference="$IMAGE_NAME:*" --format '{{.Repository}}:{{.Tag}}')
if [ -n "$OLD_IMAGES" ]; then
echo "删除以下镜像:"
echo "$OLD_IMAGES"
echo "$OLD_IMAGES" | xargs docker rmi -f
else
echo "没有找到同名镜像。"
fi
}
# 函数:重启容器
restart_container() {
echo "开始构建新的镜像..."
./build.sh
if [ $? -ne 0 ]; then
echo "镜像构建失败,无法重启容器。"
exit 1
fi
stop_container
start_container
}
# 确保参数存在
if [ "$#" -ne 1 ]; then
echo "使用方法: $0 start|stop|restart|clear"
exit 1
fi
# 根据参数执行相应的操作
case "$1" in
start)
start_container
;;
stop)
stop_container
;;
restart)
restart_container
;;
clear)
clear_container
;;
*)
echo "无效参数: $1"
echo "使用方法: $0 start|stop|restart|clear"
exit 1
;;
esac