一、# 建目录结构脚本 (setup_directories.sh)

#!/bin/bash

echo "创建minio目录结构..."
sudo mkdir -p /software/minio/{data,logs,config}

# 设置目录权限
echo "设置目录权限..."
sudo chmod -R 755 /software/minio
sudo chown -R $USER:$USER /software/minio

echo "目录创建完成!"

在这里插入图片描述

二、使用步骤

1.安装脚本(install_minio.sh)

提示:创建my-network,否则删除 --network my-network \

代码如下(示例):

#!/bin/bash

#!/bin/bash

# MinIO 安装脚本 - 修复版
# 描述: 自动安装和配置 MinIO 服务

echo "=============================================="
echo "           MinIO 安装脚本 (稳定版)"
echo "=============================================="

# 检查是否以 root 用户运行
if [ "$EUID" -ne 0 ]; then
    echo "请使用 root 用户运行此脚本"
    exit 1
fi

# 创建目录结构
echo "1. 创建目录结构..."
mkdir -p /software/minio/{data,config,logs,script}
chmod -R 755 /software/minio
chown -R $SUDO_USER:$SUDO_USER /software/minio

# 创建 MinIO 配置文件
echo "2. 创建 MinIO 配置文件..."
cat > /software/minio/config/minio_server_config.json << 'EOF'
{
    "version": "1.0",
    "credential": {
        "accessKey": "minio",
        "secretKey": "minio123456"
    },
    "region": "us-east-1",
    "browser": "on",
    "storageclass": {
        "standard": "EC:2"
    },
    "cache": {
        "drives": [],
        "expiry": 90,
        "exclude": []
    },
    "notify": {
        "webhook": {
            "1": {
                "enable": true,
                "endpoint": "",
                "authToken": ""
            }
        }
    }
}
EOF

# 尝试拉取不同镜像源的稳定版本
echo "3. 拉取 MinIO 稳定版本..."

# 定义不同版本的尝试列表
VERSION_ATTEMPTS=(
	# 最新稳定版(2025推荐)
    "quay.io/minio/minio:RELEASE.2025-04-22T22-12-26Z"
    # 最新稳定版(推荐)
    "quay.io/minio/minio:RELEASE.2024-12-30T17-25-45Z"
    "quay.io/minio/minio:RELEASE.2024-10-31T10-17-06Z"
    "quay.io/minio/minio:RELEASE.2024-08-28T08-04-40Z"
    
    # 旧仓库地址(可能还有部分版本)
    "minio/minio:RELEASE.2023-12-24T18-09-15Z"
    "minio/minio:RELEASE.2023-10-25T16-29-38Z"
    
    # 最新标签
    "quay.io/minio/minio:latest"
    
    # 替代方案:Bitnami MinIO(如果需要)
    "bitnami/minio:latest"
)

for image_url in "${VERSION_ATTEMPTS[@]}"; do
    echo "尝试拉取: $image_url"
    if docker pull $image_url; then
        echo "✅ 成功拉取: $image_url"
        TARGET_IMAGE=$image_url
        
        # 解析镜像名称和标签
        if [[ $image_url == *":"* ]]; then
            IFS=':' read -r IMAGE_NAME IMAGE_TAG <<< "$image_url"
        else
            IMAGE_NAME=$image_url
            IMAGE_TAG="latest"
        fi
        
        # 记录版本信息
        echo "IMAGE_NAME=$IMAGE_NAME" > /software/minio/config/version.info
        echo "IMAGE_TAG=$IMAGE_TAG" >> /software/minio/config/version.info
        echo "PULLED_FROM=$image_url" >> /software/minio/config/version.info
        
        break
    else
        echo "❌ 拉取失败: $image_url"
        # 如果是 quay.io 失败,尝试添加重试或检查网络
        if [[ $image_url == quay.io* ]]; then
            echo "提示: 检查是否能访问 quay.io,或尝试以下命令:"
            echo "  curl -I https://quay.io"
            echo "可能需要设置代理或使用镜像源"
        fi
    fi
    echo ""
done

if [ -z "$TARGET_IMAGE" ]; then
    echo "❌ 所有镜像拉取均失败"
    
    # 提供解决方案
    echo ""
    echo "解决方案:"
    echo "1. 检查网络连接: docker pull hello-world"
    echo "2. 如果是 quay.io 被墙,可以使用以下镜像:"
    echo "   - docker pull bitnami/minio:latest"
    echo "   - docker pull minio/minio:latest (旧仓库)"
    echo "3. 设置 Docker 镜像加速器"
    
    # 尝试使用 Docker Hub 的最新版作为后备
    echo "4. 尝试拉取最新版作为后备..."
    if docker pull minio/minio:latest; then
        echo "✅ 成功拉取 minio/minio:latest"
        TARGET_IMAGE="minio/minio:latest"
    else
        exit 1
    fi
fi

# 创建启动脚本
echo "4. 创建启动脚本..."
cat > /software/minio/script/start_minio.sh << 'EOF'
#!/bin/bash
# MinIO 启动脚本

CONFIG_DIR="/software/minio/config"
DATA_DIR="/software/minio/data"
LOGS_DIR="/software/minio/logs"

# 检查容器是否已存在
if [ "$(docker ps -aq -f name=minio)" ]; then
    echo "停止并移除现有的 MinIO 容器..."
    docker stop minio
    docker rm minio
fi

echo "启动 MinIO 容器..."

docker run -d \
  --name minio \
  --restart=unless-stopped \
  --network my-network \ #网络
  -p 9000:9000 \
  -p 9090:9090 \
  -e "MINIO_ROOT_USER=minio" \
  -e "MINIO_ROOT_PASSWORD=minio123456" \
  -v $DATA_DIR:/data \
  -v $CONFIG_DIR:/root/.minio \
  $TARGET_IMAGE server /data --console-address ":9090"

echo "MinIO 已启动!"
echo "控制台地址: http://localhost:9090"
echo "API 地址: http://localhost:9000"
echo "用户名: minio"
echo "密码: minio123456"
EOF

chmod +x /software/minio/script/start_minio.sh

# 设置脚本权限
echo "5. 设置脚本权限..."
chmod +x /software/minio/script/*.sh 2>/dev/null || true
chown -R $SUDO_USER:$SUDO_USER /software/minio

echo "=============================================="
echo "✅ MinIO 安装完成!"
echo "=============================================="
echo "使用的镜像: $TARGET_IMAGE"
echo "安装目录: /software/minio"
echo "数据目录: /software/minio/data"
echo "配置目录: /software/minio/config"
echo "日志目录: /software/minio/logs"
echo "脚本目录: /software/minio/script"
echo ""
echo "下一步操作:"
echo "1. 启动服务: /software/minio/script/start_minio.sh"
echo "2. 查看状态: docker ps | grep minio"
echo "3. 访问控制台: http://服务器IP:9090"
echo "4. 用户名: minio"
echo "5. 密码: minio123456"
echo "=============================================="

2.启动脚本(start_minio.sh)

代码如下(示例):

#!/bin/bash

# MinIO 启动脚本
# 描述: 启动 MinIO Docker 容器服务

echo "=============================================="
echo "           MinIO 服务启动"
echo "=============================================="

# 检查 Docker 服务状态
if ! systemctl is-active --quiet docker; then
    echo "启动 Docker 服务..."
    systemctl start docker
    sleep 3
fi

# 读取版本信息
VERSION_FILE="/software/minio/config/version.info"
DEFAULT_IMAGE="quay.io/minio/minio:latest"

if [ -f "$VERSION_FILE" ]; then
    echo "读取版本配置信息..."
    source "$VERSION_FILE"
    
    # 处理不同的版本信息格式
    if [ -n "$IMAGE_NAME" ] && [ -n "$IMAGE_TAG" ]; then
        # 新格式:IMAGE_NAME 和 IMAGE_TAG
        TARGET_IMAGE="${IMAGE_NAME}:${IMAGE_TAG}"
    elif [ -n "$ACTUAL_VERSION" ]; then
        # 旧格式:只有 ACTUAL_VERSION
        TARGET_IMAGE="minio/minio:${ACTUAL_VERSION}"
    elif [ -n "$PULLED_FROM" ]; then
        # 直接从拉取记录获取
        TARGET_IMAGE="$PULLED_FROM"
    else
        TARGET_IMAGE="$DEFAULT_IMAGE"
    fi
else
    # 如果没有版本记录,使用默认
    TARGET_IMAGE="$DEFAULT_IMAGE"
fi

echo "使用镜像: $TARGET_IMAGE"

# 解析镜像名称和标签
IMAGE_NAME_PART=$(echo "$TARGET_IMAGE" | cut -d':' -f1)
IMAGE_TAG_PART=$(echo "$TARGET_IMAGE" | cut -d':' -f2-)

# 检查 MinIO 镜像是否存在
echo "检查 MinIO 镜像..."
IMAGE_EXISTS=false

# 方法1: 直接尝试查找完整镜像
if docker image inspect "$TARGET_IMAGE" > /dev/null 2>&1; then
    IMAGE_EXISTS=true
    echo "✅ 镜像存在: $TARGET_IMAGE"
else
    # 方法2: 检查是否有任何标签匹配
    if docker images | awk -v img="$IMAGE_NAME_PART" -v tag="$IMAGE_TAG_PART" \
        '$1 == img && $2 == tag {exit 0} END {exit 1}'; then
        IMAGE_EXISTS=true
        echo "✅ 镜像存在: $TARGET_IMAGE"
    else
        echo "❌ 镜像不存在,尝试拉取..."
        
        # 尝试拉取镜像
        if ! docker pull "$TARGET_IMAGE"; then
            echo "⚠️ 镜像拉取失败,尝试使用默认镜像..."
            if docker pull "$DEFAULT_IMAGE"; then
                TARGET_IMAGE="$DEFAULT_IMAGE"
                IMAGE_NAME_PART=$(echo "$TARGET_IMAGE" | cut -d':' -f1)
                IMAGE_TAG_PART=$(echo "$TARGET_IMAGE" | cut -d':' -f2-)
                IMAGE_EXISTS=true
                echo "✅ 使用默认镜像: $TARGET_IMAGE"
            else
                echo "❌ 所有镜像拉取均失败"
                echo "请检查网络连接或手动拉取镜像:"
                echo "  docker pull quay.io/minio/minio:latest"
                exit 1
            fi
        else
            IMAGE_EXISTS=true
            echo "✅ 镜像拉取成功: $TARGET_IMAGE"
        fi
    fi
fi

# 检查容器是否已存在并运行
if docker ps --format '{{.Names}}' | grep -q "^minio$"; then
    echo "⚠️ MinIO 容器已在运行中"
    echo "如需重启,请运行: /software/minio/script/restart_minio.sh"
    exit 0
fi

# 检查容器是否存在但已停止
if docker ps -a --format '{{.Names}}' | grep -q "^minio$"; then
    echo "启动已存在的 MinIO 容器..."
    docker start minio
else
    echo "创建并启动新的 MinIO 容器..."

    # 创建必要的目录
    mkdir -p /software/minio/data
    mkdir -p /software/minio/config
    mkdir -p /software/minio/logs
    
    # 设置目录权限
    chmod -R 755 /software/minio
    [ -n "$SUDO_USER" ] && chown -R "$SUDO_USER:$SUDO_USER" /software/minio 2>/dev/null || true

    # 启动 MinIO 容器
    docker run -d \
      --name minio \
      --restart always \
      -p 9000:9000 \
      -p 9090:9090 \
      -e "MINIO_ROOT_USER=minio" \
      -e "MINIO_ROOT_PASSWORD=minio123456" \
      -v /software/minio/data:/data \
      -v /software/minio/config:/root/.minio \
      -v /software/minio/logs:/var/log/minio \
      "$TARGET_IMAGE" \
      server /data \
      --console-address ":9090" \
      --address ":9000"
    
    # 记录启动的镜像信息
    echo "STARTED_IMAGE=$TARGET_IMAGE" > /software/minio/config/last_started.info
    date >> /software/minio/config/last_started.info
fi

# 等待服务启动
echo "等待服务启动..."
sleep 10

# 增加健康检查
for i in {1..10}; do
    if docker ps --format '{{.Names}}' | grep -q "^minio$" && \
       docker logs minio 2>&1 | tail -5 | grep -q "API\|Console"; then
        echo "✅ MinIO 服务启动成功"
        break
    fi
    
    if [ $i -eq 10 ]; then
        echo "⚠️ MinIO 启动较慢,仍在初始化..."
        echo "查看日志: docker logs minio"
    else
        echo "等待服务就绪... ($i/10)"
        sleep 3
    fi
done

# 获取服务器IP
SERVER_IP=$(hostname -I | awk '{print $1}')
if [ -z "$SERVER_IP" ]; then
    SERVER_IP="localhost"
fi

echo ""
echo "📊 服务信息:"
echo "----------------------------------------------"
echo "容器状态: $(docker inspect -f '{{.State.Status}}' minio 2>/dev/null || echo '未知')"
echo "使用镜像: $TARGET_IMAGE"
echo "控制台地址: http://${SERVER_IP}:9090"
echo "API 地址:   http://${SERVER_IP}:9000"
echo "用户名:     minio"
echo "密码:       minio123456"
echo ""
echo "🔧 常用命令:"
echo "查看日志:   docker logs minio"
echo "重启服务:   docker restart minio"
echo "停止服务:   docker stop minio"
echo "进入容器:   docker exec -it minio /bin/sh"
echo "----------------------------------------------"

# 显示容器日志的最后几行
echo ""
echo "📝 最近日志:"
docker logs minio --tail 5 2>/dev/null || echo "无法获取日志"

echo "=============================================="

3. 重启脚本(restart_minio.sh)

代码如下(示例):

#!/bin/bash

# MinIO 重启脚本
# 描述: 重启 MinIO Docker 容器服务

echo "=============================================="
echo "           MinIO 服务重启"
echo "=============================================="

# 调用停止脚本
echo "停止 MinIO 服务..."
/software/minio/script/stop_minio.sh

# 等待清理完成
sleep 2

# 调用启动脚本
echo "启动 MinIO 服务..."
/software/minio/script/start_minio.sh

# 检查最终状态
if docker ps | grep -q minio; then
    echo "✅ MinIO 服务重启完成"
else
    echo "❌ MinIO 服务重启失败"
    exit 1
fi

echo "=============================================="

4.停止脚本(stop_minio.sh)

代码如下(示例):

#!/bin/bash

# MinIO 停止脚本
# 描述: 停止 MinIO Docker 容器服务

echo "=============================================="
echo "           MinIO 服务停止"
echo "=============================================="

# 检查容器是否存在
if docker ps -a | grep -q minio; then
    # 停止容器
    if docker ps | grep -q minio; then
        echo "停止 MinIO 容器..."
        docker stop minio
        echo "✅ MinIO 容器已停止"
    else
        echo "ℹ️ MinIO 容器已处于停止状态"
    fi
    
    # 删除容器
    echo "删除 MinIO 容器..."
    docker rm minio
    echo "✅ MinIO 容器已删除"
else
    echo "ℹ️ MinIO 容器不存在,无需操作"
fi

echo "=============================================="

5.执行脚本

代码如下(示例):

1. 给所有脚本添加执行权限
chmod +x setup_directories.sh install_minio.sh restart_minio.sh start_minio.sh stop_minio.sh

2. 创建目录结构
./setup_directories.sh

3. 安装
./install_minio.sh

4. 启动
./start_minio.sh

更多推荐