#!/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