Docker啟用MinIO
MinIO是根據GNU Affero通用公共許可證v3.0發布的高性能對象存儲。它與Amazon S3雲存儲服務兼容的API。
Docker啟用MinIO儲存
執行 Image
docker run -d --name minio -e "MINIO_ROOT_USER=root" -e "MINIO_ROOT_PASSWORD=root1234" -p 9000:9000 -p 9001:9001 minio/minio server /data --console-address ":9001"
--name minio
,命名container名稱為minio
。-v /data/minio:/data/minio
該命令將主機/data/minio
目錄對映到容器中的/data/minio
目錄中- MinIO 還提供了圖形管理介面,在瀏覽器輸入
ip:9001
即可檢視 - 不管是圖形介面操作,還是客戶端操作,預設賬號密碼都為
minioadmin
-e
環境變數,這裡用了自定義賬號密碼,賬號不能小於 3 字元,密碼不能小於 8 字元
Go初始化
導入github.com/minio/minio-go/v7
,注意這個後面的v7
,在自動引包時可能會漏掉,導致使用到舊版的同名函數而報錯
func InitMinio() {
ctx := context.Background()
endpoint := "localhost:9000"
accessKeyID := "root"
secretAccessKey := "root1234"
useSSL := false
// Initialize minio client object.
minioClient, err := minio.New(endpoint, &minio.Options{
Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
Secure: useSSL,
})
if err != nil {
log.Fatalln(err)
}
// 創建預設的bucket
// Make a new bucket called mymusic.
bucketName := "mymusic"
location := "us-east-1" // 這個是AWS用的,詳細查他官方
err = minioClient.MakeBucket(ctx, bucketName, minio.MakeBucketOptions{Region: location})
if err != nil {
// Check to see if we already own this bucket (which happens if you run this twice)
exists, errBucketExists := minioClient.BucketExists(ctx, bucketName)
if errBucketExists == nil && exists {
log.Printf("We already own %s\n", bucketName)
} else {
log.Fatalln(err)
}
} else {
log.Printf("Successfully created %s\n", bucketName)
}
// 試著上傳一個.zip
objectName := "golden-oldies.zip"
filePath := "/tmp/golden-oldies.zip"
contentType := "application/zip"
// Upload the zip file with FPutObject
info, err := minioClient.FPutObject(ctx, bucketName, objectName, filePath, minio.PutObjectOptions{ContentType: contentType})
if err != nil {
log.Fatalln(err)
}
log.Printf("Successfully uploaded %s of size %d\n", objectName, info.Size)
}
配合Gin框架範例
// 假定要上傳頭像,先獲取圖片文件資訊
file, _ := ctx.FormFile("avatar")
// 這裡使用minioClient.PutObject()方法上傳,入參是file.Open()。
f, _ := file.Open()
// 新增一個哈希命名規則防止圖片覆蓋
m5 := md5.New()
m5.Write([]byte(file.Filename+時間或uuid等等)
fileName_hash := hex.EncodeToString(m5.Sum(nil))
// 上傳到minio
info, err := model.MinioClient.PutObject(ctx, "avatar", fileName_hash, f, -1, minio.PutObjectOptions{ContentType: "avatar"})
if err != nil {
log.Fatalln(err)
return
}
log.Printf("Successfully uploaded %s of size %d\n", file.Filename, info.Size)
細節補充
- minio儲存的單位是 BUCKETS(桶),創建完之後預設的Access Policy為Private,外部無法訪問,要改成public才行
- 預設上傳的檔案網址就是http://{endpoint}/{buckets}/{Filename},只要BUCKETS是public就能直接訪問
上次修改於 2021-09-29