140 lines
3.2 KiB
Bash
Executable File
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
|