一、简介

既然你不小心点进来了,不妨耐心听我几句,吃不了亏,上不了当。我力求言简意赅地描述本文主旨,以便大家快速判断是否值得看下去。
由于今年五月份 minio 版本更新后,将社区版 Web 管理页面中管理功能进行了阉割,导致更新最新版后只能在 Web 管理页面中使用最基本的对象查看和上传功能。尽管本人也能用过 mc 客户端进行操作,但总感觉不是那么便利。于是查找许久,发现了一个使用 Docker 进行编译构建的项目:Harsh-2002/MinIO。自己尝试后能正常启动,且登录管理端后能出现之前的管理功能:

好了,闲言少叙,话归正题,诸君且听我娓娓道来。
该项目的托管地址为:
https://github.com/Harsh-2002/MinIO

经过浏览后发现,该项目仅有若干构建脚本,而非 fork minio分支后进行魔改:

通过查看其 Dockerfile 定义,发现基于 console 程序基于 object-browser 的 v1.7.6 构建,而 minio 则看 MINIO_VERSION变量,若为 latest,则自动基于 master 分支进行构建:


当然我也尝试按照该思路尝试在本地电脑上编译构建,yarn、node、make、go 都进行了安装,奈何最后执行 make 时报错,目测是其构建脚本是专门针对 Linux使用,在 windows 下不好用。所以也能按该大神的思路,使用 Docker 进行构建。若确有本地构建需求,可按该思路在 Linux 平台上进行编译构建。
二、准备构建文件
下面我给贴出那三个关键脚本的内容:
- Dockfile
# Multi-stage build for object storage with web console
ARG MINIO_VERSION=latest
# Build web console UI
FROM node:18-alpine AS console-ui-builder
WORKDIR /app
RUN apk add --no-cache git &&
corepack enable &&
git clone https://github.com/minio/object-browser.git . &&
git checkout v1.7.6 &&
cd web-app &&
yarn install --frozen-lockfile &&
yarn build
# Build console binary
FROM golang:1.24-alpine AS console-builder
# Add architecture arguments
ARG TARGETARCH
ARG TARGETOS=linux
WORKDIR /app
RUN apk add --no-cache git make &&
git clone https://github.com/minio/object-browser.git . &&
git checkout v1.7.6
COPY --from=console-ui-builder /app/web-app/build ./web-app/build
# Set GOOS and GOARCH for proper cross-compilation
ENV GOOS=${TARGETOS} GOARCH=${TARGETARCH} CGO_ENABLED=0
RUN make console
# Build storage server from source
FROM golang:1.24-alpine AS server-builder
ARG MINIO_VERSION=latest
# Add architecture arguments
ARG TARGETARCH
ARG TARGETOS=linux
ENV GOPATH=/go
ENV CGO_ENABLED=0
# Set GOOS and GOARCH for proper cross-compilation
ENV GOOS=${TARGETOS}
ENV GOARCH=${TARGETARCH}
WORKDIR /workspace
# Install build dependencies
RUN apk add --no-cache ca-certificates git make curl bash &&
go install aead.dev/minisign/cmd/minisign@v0.2.1
# Clone and build server
RUN git clone https://github.com/minio/minio.git . &&
if [ "$MINIO_VERSION" != "latest" ]; then
echo "Checking out version: $MINIO_VERSION" &&
git checkout ${MINIO_VERSION};
else
echo "Building from latest master";
fi
# Build server binary
RUN COMMIT_ID=$(git rev-parse --short HEAD) &&
echo "Building version: $MINIO_VERSION commit: $COMMIT_ID" &&
CGO_ENABLED=0 go build -trimpath
-ldflags "-s -w -X github.com/minio/minio/cmd.ReleaseTag=${MINIO_VERSION}"
-o /usr/bin/minio . &&
/usr/bin/minio --version
# Download and verify client binary - use TARGETARCH instead of BUILDARCH
RUN curl -s -q https://dl.min.io/client/mc/release/linux-${TARGETARCH}/mc -o /usr/bin/mc &&
curl -s -q https://dl.min.io/client/mc/release/linux-${TARGETARCH}/mc.minisig -o /usr/bin/mc.minisig &&
chmod +x /usr/bin/mc &&
/go/bin/minisign -Vqm /usr/bin/mc -x /usr/bin/mc.minisig -P RWTx5Zr1tiHQLwG9keckT0c45M3AGeHD6IvimQHpyRywVWGbP1aVSGav &&
/usr/bin/mc --version
# Final runtime image
FROM alpine:latest
ARG MINIO_VERSION=latest
ARG TARGETARCH
LABEL maintainer="Anurag Vishwakarma <av7312002@gmail.com>"
version="${MINIO_VERSION}"
org.opencontainers.image.source="https://github.com/minio/minio"
org.opencontainers.image.version="${MINIO_VERSION}"
org.opencontainers.image.licenses="AGPL-3.0"
# Install runtime dependencies and create user
RUN apk add --no-cache ca-certificates curl bash &&
addgroup -g 1000 minio &&
adduser -D -u 1000 -G minio minio &&
mkdir -p /data /etc/minio/console &&
chown -R minio:minio /data /etc/minio
# Copy binaries
COPY --from=server-builder /usr/bin/minio /usr/bin/minio
COPY --from=server-builder /usr/bin/mc /usr/bin/mc
COPY --from=console-builder /app/console /usr/bin/console
# Copy license files
COPY --from=server-builder /workspace/CREDITS /licenses/CREDITS
COPY --from=server-builder /workspace/LICENSE /licenses/LICENSE
# Copy startup script
COPY start.sh /usr/bin/start.sh
RUN chmod +x /usr/bin/start.sh
# Server configuration
ENV MINIO_UPDATE_MINISIGN_PUBKEY="RWTx5Zr1tiHQLwG9keckT0c45M3AGeHD6IvimQHpyRywVWGbP1aVSGav"
MC_CONFIG_DIR=/tmp/.mc
# Console configuration
ENV CONSOLE_MINIO_SERVER=http://localhost:9000
# Configurable ports
ENV MINIO_API_PORT=9000
MINIO_CONSOLE_PORT=9001
MINIO_ADMIN_CONSOLE_PORT=9002
# Expose ports
EXPOSE 9000 9001 9002
# Health check
HEALTHCHECK --interval=30s --timeout=20s --start-period=5s --retries=3
CMD curl -f http://localhost:${MINIO_API_PORT}/minio/health/live || exit 1
# Run as non-root user
USER minio
WORKDIR /data
# Start services
CMD ["/usr/bin/start.sh"]
- start.sh
#!/bin/bash
set -e
# Default port configuration
MINIO_API_PORT=${MINIO_API_PORT:-9000}
MINIO_CONSOLE_PORT=${MINIO_CONSOLE_PORT:-9001}
MINIO_ADMIN_CONSOLE_PORT=${MINIO_ADMIN_CONSOLE_PORT:-9002}
# Default region configuration
export MINIO_REGION=${MINIO_REGION:-us-east-1}
export CONSOLE_MINIO_REGION=${CONSOLE_MINIO_REGION:-$MINIO_REGION}
echo "Starting object storage with web console..."
echo "API Port: ${MINIO_API_PORT}"
echo "Console Port: ${MINIO_CONSOLE_PORT}"
echo "Admin Console Port: ${MINIO_ADMIN_CONSOLE_PORT}"
# Start storage server
minio server /data --address ":${MINIO_API_PORT}" --console-address ":${MINIO_CONSOLE_PORT}" &
SERVER_PID=$!
# Wait for server to be ready
echo "Waiting for server to start..."
MAX_RETRIES=30
RETRY_COUNT=0
while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do
if curl -sf http://localhost:${MINIO_API_PORT}/minio/health/live >/dev/null 2>&1; then
echo "✓ Server is ready!"
break
fi
RETRY_COUNT=$((RETRY_COUNT + 1))
sleep 1
done
if [ $RETRY_COUNT -eq $MAX_RETRIES ]; then
echo "✗ Server failed to start within ${MAX_RETRIES} seconds"
exit 1
fi
# Start web console
echo "Starting admin console on port ${MINIO_ADMIN_CONSOLE_PORT}..."
export CONSOLE_MINIO_SERVER="http://localhost:${MINIO_API_PORT}"
export CONSOLE_PBKDF_PASSPHRASE=${CONSOLE_PBKDF_PASSPHRASE:-$(head /dev/urandom | tr -dc 'A-Za-z0-9' | head -c 32)}
export CONSOLE_PBKDF_SALT=${CONSOLE_PBKDF_SALT:-$(head /dev/urandom | tr -dc 'A-Za-z0-9' | head -c 48)}
export CONSOLE_MINIO_REGION=${CONSOLE_MINIO_REGION:-$MINIO_REGION}
console server --port ${MINIO_ADMIN_CONSOLE_PORT} &
CONSOLE_PID=$!
echo "✓ All services started successfully!"
echo " - API: http://localhost:${MINIO_API_PORT}"
echo " - Console: http://localhost:${MINIO_CONSOLE_PORT}"
echo " - Admin Console: http://localhost:${MINIO_ADMIN_CONSOLE_PORT}"
# Wait for processes and handle exit
wait -n $SERVER_PID $CONSOLE_PID
EXIT_CODE=$?
echo "A service has stopped unexpectedly (exit code: ${EXIT_CODE})"
exit $EXIT_CODE
- docker-compose.yml
services:
minio:
# To use an ARM64 image, create a .env file with: MINIO_IMAGE_TAG=latest-arm64
image: firstfinger/minio:${MINIO_IMAGE_TAG:-latest-amd64}
container_name: minio
ports:
- "9000:9000"
- "9001:9001"
- "9002:9002"
environment:
# Authentication (Required)
MINIO_ROOT_USER: UL5YXh4vjy3yEAaS4eW8
MINIO_ROOT_PASSWORD: 36bpUPfiptWp6M7uBFsM75uKbPXZgW
# Region Configuration (Optional, defaults to us-east-1)
# MINIO_REGION: us-east-1
# Port Configuration (Optional, allows overriding defaults)
# Note: If you change these, you must also update the 'ports' section above.
# MINIO_API_PORT: 9000
# MINIO_CONSOLE_PORT: 9001
# MINIO_ADMIN_CONSOLE_PORT: 9002
# Console Security (Optional, auto-generated if not provided)
# CONSOLE_PBK_DF_PASSPHRASE: your-secret-passphrase
# CONSOLE_PBKDF_SALT: your-secret-salt
volumes:
- ./data:/data # sudo chown -R 1000:1000 ./data
restart: unless-stopped
接着将以上三个文件内容分别创建对应的文件并粘贴内容:

当然,如果装有 Git 版本管理工具,也可直接通过 git checkout 命令来拉取对应的项目。
三、打包构建
接着打开该命令行工具,执行如下命令来打包 docker 镜像:
docker build -t custom-minio:latest .
当然,得将目录定位到该 Dockfile 文件所在目录下。执行后结果如下所示:

此时使用 “docker images” 命令查看镜像列表便发现了自定义的 minio 镜像:

接着运行如下命令来基于自己打包的镜像启动一个容器:
docker run -d --name minio -p 9000:9000 -p 9001:9001 -p 9002:9002 -v ./data:/data -e MINIO_ROOT_USER=minioadmin -e MINIO_ROOT_PASSWORD=minioadmin custom-minio:latest
执行结果如下所示:

接着发现该 Dockerfile 目录下出现了一个 data 目录:

当然,此时需访问“http://loalhost:9002”,登录后如下:

若还是如往常打开 “http://localhost:9001”,则登录后仍为最新阉割版:

四、使用
当然,下面我只演示常用操作,更多操作大家自行探索。若已十分熟悉 Minio 的管理页面操作,可忽略该章节。
4.1 桶操作
4.1.1 创建桶
在 管理端页面点击“Buckets” 便会跳转到桶管理页面:

接着点击右侧的“Create Bucket”后跳转到创建页面:

这里我输入 test,其他保持默认,然后点击“Create Bucket”:

点击后便成功创建了 test 桶:

4.1.2 删除桶
点击要删除的桶,进入桶管理页面并点击“Delete Bucket”:

点击后会弹出确认窗口:

继续点击“Delete”便会真正删除该桶:
4.2 对象操作
第一需创建一个 test 桶以便进行测试:

接着点击“Object Browser”切换到对象管理页面:

4.2.1 上传
选择桶后点击进入,因此处只有一个test 桶,故进入后如下所示:

接着点击右侧的“upload”会弹出上传选项:upload file 和 upload folder:

我这里选择上传文件,上传后如下所示:

4.2.2 下载
点击要下载的文件,如:“测试文本.txt”,点击后右侧会出现该对象的操作选项:

此时点击右侧操作选项中的“Download”便会开始下载,下载后如下所示:

4.2.3 预览
对于预览而言,minio 只支持若干媒体的预览。这里我以视频预览为例进行演示。
点击“北极熊.map4”出现其操作选项:

接着选择“Preview” 便会弹出预览窗口:

4.2.4 分享
所谓分享就是生成一个直接访问的链接。这里选择“都选C.mp3”进行演示。
点击“都选c.mp3”后出现其操作选项:

接着选择“Share”便会弹出分享设置信息:

这里可设置分享链接的有效时间,设置完毕后点击如下位置进行拷贝:

4.2.5 删除
点击要删除的文件,则右侧操作选项中点击“Delete”即可进行删除:

点击后会弹出删除确认窗口:

此时继续点击“Delete”便会真正删除:



