golang操作Amazon S3兼容存储的Minio客户端插件mc的使用
Golang操作Amazon S3兼容存储的Minio客户端插件mc的使用
MinIO Client (mc) 是一个现代化的替代UNIX命令如ls、cat、cp、mirror、diff、find等的工具。它支持文件系统和Amazon S3兼容的云存储服务(AWS签名v2和v4)。
安装MinIO Client
使用Golang安装
go install github.com/minio/mc@latest
Docker容器安装
docker pull minio/mc
docker run minio/mc ls play
macOS安装
brew install minio/stable/mc
mc --help
Linux安装
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
./mc --help
Windows安装
mc.exe --help
添加云存储服务
要添加一个或多个Amazon S3兼容主机,请按照以下说明操作:
mc alias set <ALIAS> <YOUR-S3-ENDPOINT> <YOUR-ACCESS-KEY> <YOUR-SECRET-KEY> --api <API-SIGNATURE> --path <BUCKET-LOOKUP-TYPE>
示例 - MinIO云存储
mc alias set minio http://192.168.1.51 BKIKJAA5BMMU2RHO6IBB V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12
示例 - Amazon S3云存储
mc alias set s3 https://s3.amazonaws.com BKIKJAA5BMMU2RHO6IBB V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12
示例 - Google云存储
mc alias set gcs https://storage.googleapis.com BKIKJAA5BMMU2RHO6IBB V8f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12
测试设置
mc ls play
日常使用
创建存储桶
mc mb play/mybucket
复制对象
mc cp myobject.txt play/mybucket
Shell别名
alias ls='mc ls'
alias cp='mc cp'
alias cat='mc cat'
alias mkdir='mc mb'
alias pipe='mc pipe'
alias find='mc find'
Golang代码示例
以下是使用Golang操作MinIO的示例代码:
package main
import (
"context"
"fmt"
"log"
"github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials"
)
func main() {
// 初始化MinIO客户端
endpoint := "play.min.io"
accessKeyID := "Q3AM3UQ867SPQQA43P2F"
secretAccessKey := "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG"
useSSL := true
// 初始化minio客户端对象
minioClient, err := minio.New(endpoint, &minio.Options{
Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
Secure: useSSL,
})
if err != nil {
log.Fatalln(err)
}
// 列出所有存储桶
buckets, err := minioClient.ListBuckets(context.Background())
if err != nil {
fmt.Println(err)
return
}
for _, bucket := range buckets {
fmt.Println(bucket)
}
// 创建一个新的存储桶
bucketName := "mynewbucket"
location := "us-east-1"
err = minioClient.MakeBucket(context.Background(), bucketName, minio.MakeBucketOptions{Region: location})
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("Successfully created %s\n", bucketName)
// 上传文件
objectName := "golden-oldies.zip"
filePath := "/tmp/golden-oldies.zip"
contentType := "application/zip"
// 上传zip文件
info, err := minioClient.FPutObject(context.Background(), bucketName, objectName, filePath, minio.PutObjectOptions{ContentType: contentType})
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("Successfully uploaded %s of size %d\n", objectName, info.Size)
}
命令列表
MinIO Client提供了丰富的命令来管理存储:
alias 管理配置文件中的服务器凭据
admin 管理MinIO服务器
anonymous 管理对存储桶和对象的匿名访问
batch 管理批处理作业
cp 复制对象
cat 显示对象内容
diff 列出两个存储桶之间对象名称、大小和日期的差异
du 递归汇总磁盘使用情况
encrypt 管理存储桶加密配置
event 管理对象通知
find 搜索对象
get 将s3对象获取到本地
head 显示对象的前'n'行
ilm 管理存储桶生命周期
idp 管理MinIO身份提供者服务器配置
license 许可证相关命令
legalhold 管理对象的法定保留
ls 列出存储桶和对象
mb 创建存储桶
mv 移动对象
mirror 将对象同步到远程站点
od 测量单流上传和下载
ping 执行活跃性检查
pipe 将STDIN流式传输到对象
put 将对象上传到存储桶
quota 管理存储桶配额
rm 删除对象
retention 设置对象的保留
rb 删除存储桶
replicate 配置服务器端存储桶复制
ready 检查集群是否就绪
sql 在对象上运行SQL查询
stat 显示对象元数据
support 支持相关命令
share 生成临时访问对象的URL
tree 以树形格式列出存储桶和对象
tag 管理存储桶和对象的标签
undo 撤销PUT/DELETE操作
update 将mc更新到最新版本
version 管理存储桶版本控制
watch 监听对象通知事件
许可证
mc
的使用受GNU AGPLv3许可证的约束,该许可证可以在LICENSE文件中找到。
更多关于golang操作Amazon S3兼容存储的Minio客户端插件mc的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang操作Amazon S3兼容存储的Minio客户端插件mc的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang操作Minio客户端(mc)的使用指南
Minio客户端(mc)是一个命令行工具,用于与Minio和Amazon S3兼容的云存储服务进行交互。在Golang中,我们可以直接使用Minio官方提供的Go SDK,也可以集成mc的功能。
使用Minio Go SDK
Minio官方提供了功能完善的Go SDK,以下是基本使用方法:
1. 安装SDK
go get github.com/minio/minio-go/v7
2. 基本示例代码
package main
import (
"context"
"fmt"
"log"
"github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials"
)
func main() {
// 初始化客户端
endpoint := "play.min.io" // 或你的Minio服务器地址
accessKeyID := "Q3AM3UQ867SPQQA43P2F"
secretAccessKey := "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG"
useSSL := true
// 初始化Minio客户端对象
minioClient, err := minio.New(endpoint, &minio.Options{
Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
Secure: useSSL,
})
if err != nil {
log.Fatalln(err)
}
// 列出所有存储桶
buckets, err := minioClient.ListBuckets(context.Background())
if err != nil {
log.Fatalln(err)
}
for _, bucket := range buckets {
fmt.Println(bucket)
}
// 创建一个新存储桶
bucketName := "my-new-bucket"
location := "us-east-1"
err = minioClient.MakeBucket(context.Background(), bucketName, minio.MakeBucketOptions{Region: location})
if err != nil {
// 检查存储桶是否已存在
exists, errBucketExists := minioClient.BucketExists(context.Background(), bucketName)
if errBucketExists == nil && exists {
log.Printf("Bucket %s already exists\n", bucketName)
} else {
log.Fatalln(err)
}
} else {
log.Printf("Successfully created bucket %s\n", bucketName)
}
// 上传文件
objectName := "testfile.txt"
filePath := "/tmp/testfile.txt"
contentType := "application/octet-stream"
// 上传文件
info, err := minioClient.FPutObject(context.Background(), 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)
}
集成mc命令行工具
如果你需要在Golang中直接调用mc命令行工具,可以使用os/exec
包:
package main
import (
"fmt"
"log"
"os/exec"
)
func main() {
// 设置mc别名
setAliasCmd := exec.Command("mc", "alias", "set", "myminio", "http://localhost:9000", "minioadmin", "minioadmin")
if err := setAliasCmd.Run(); err != nil {
log.Fatalf("Failed to set alias: %v", err)
}
// 列出存储桶
listCmd := exec.Command("mc", "ls", "myminio")
output, err := listCmd.CombinedOutput()
if err != nil {
log.Fatalf("Failed to list buckets: %v", err)
}
fmt.Printf("Buckets:\n%s", string(output))
// 上传文件
uploadCmd := exec.Command("mc", "cp", "/path/to/local/file.txt", "myminio/mybucket/")
if err := uploadCmd.Run(); err != nil {
log.Fatalf("Failed to upload file: %v", err)
}
fmt.Println("File uploaded successfully")
}
高级功能
1. 生成预签名URL
// 生成预签名URL,有效期7天
presignedURL, err := minioClient.PresignedGetObject(context.Background(), bucketName, objectName, time.Second*24*60*60*7, nil)
if err != nil {
log.Fatalln(err)
}
fmt.Println("Presigned URL:", presignedURL)
2. 设置存储桶策略
policy := `{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {"AWS": ["*"]},
"Action": ["s3:GetObject"],
"Resource": ["arn:aws:s3:::mybucket/*"]
}
]
}`
err = minioClient.SetBucketPolicy(context.Background(), bucketName, policy)
if err != nil {
log.Fatalln(err)
}
3. 监听存储桶事件
// 监听存储桶事件
for notificationInfo := range minioClient.ListenBucketNotification(context.Background(), bucketName, "", "", []string{
"s3:ObjectCreated:*",
"s3:ObjectRemoved:*",
}) {
if notificationInfo.Err != nil {
log.Println(notificationInfo.Err)
continue
}
for _, record := range notificationInfo.Records {
fmt.Printf("Event: %s, Bucket: %s, Object: %s\n",
record.EventName,
record.S3.Bucket.Name,
record.S3.Object.Key)
}
}
最佳实践
- 连接池管理:Minio客户端会自动管理连接池,无需手动处理
- 上下文使用:始终传递context以便于超时和取消控制
- 错误处理:检查所有操作返回的错误
- 并行上传:对于大文件,使用分片上传提高性能
通过以上方法,你可以在Golang中高效地操作Minio或S3兼容的存储服务。