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