阅读 5397

全网最全的minio问题常见报错及解决

前言

  • 在线音乐戳我呀!

  • 音乐博客源码上线啦!

  • 最近在整理自己的在线音乐(因为最近换服务器了),发现上传的图片文件很杂乱,如:音乐上传到minio中(文件服务器),IT知识模块的图片上传在Node指定的文件夹中,其他模块的文件又是Node的另外一个文件夹。

  • 就想着能不能全部都由一个来管理这些文件,优先想到之前实习的时候公司(dpf)搭建个文件服务器,也用了一下确实是挺方便的,也就是今天的主角 -- Minio。

  • 其实自己的在线音乐已经用了很久了,只不过没有说对全部文件都归其管理,再加上现在应用部署在Docker上,不知道为什么Node文件映射失败,但Minio却映射得出来,这也是一开始初心想文件都放在minio中。

  • 上一篇有请Minio统一管理文件文章有实操代码,但好像少了点什么?

  • oh ~ 原来是少了点常用报错处理总结,这不,后续来了。刚好换服务器的时候还真遇到一个棘手的问题。

  • Are you ready ?


假期再次快乐。

先来张图效果。

fbd57b4cd563eedf704d7ae9570938d.png

Minio界面直观、可视化界面、方便管理、上传下载流程简单,还能设置权限、失效时间等等。

使用三年,遇到的坑

  • 从win拷过来linux使用命令是不可以的(总是cvcv,果然出事了?)

  • 新版本有问题,建议使用minio/minio:RELEASE.2021-06-17T00-10-46Z(寻找回忆中的Minio)

  • MINIO_ACCESS_KEY和MINIO_SECRET_KEY已弃用?

  • putObject上传后得到的url在浏览器里打开是下载文件,而不是直接显示图片(putObject图片后,图片加载不了????)

一、cv出问题了?

minio一开始是部署到47上的window,后面47服务器换成docker环境,minio也换成了docker运行,再后来被我迁移到39的docker上。(因为服务器到期)

过程也是坎坷,但也正因为这些“风雨”,才能见到“彩虹”。

在47服务器上的docker环境已经是半年前的事情了,当时一顿操作如下:

// 拉取minio镜像 docker pull minio/minio // 跑起 docker run -p 9000:9000 --name minio -d  -e "MINIO_ACCESS_KEY=admin"  -e "MINIO_SECRET_KEY=123456"  -v /home/minio:/data  -v /home/minio/config:/root/.minio  minio/minio  server /data 复制代码

这些参数在上一篇有请Minio统一管理文件文章有讲到哦~

然后就可以正常运行起来了。

前几天从47 -> 39服务器,我也跟47一样的操作,直接拉闸。

报了:No such file or directory

遇到错不要慌,先找下有用过的人。

cd7244b4e63aea1bc84e5bcb707bf3b.png

好,我都懂的。一个人也很好的。

于是我百度了一遍,其中有一篇给了我灵感。

2.png

他的意思是说:在win开发的脚本,需要转换一下格式。

因为我的那串长长的docker run minio ...命令是从dos文档上复制过来的,直接拷到linux上可能有编码上的问题,于是我怀着猜测的心态去手敲了一遍,竟然,竟然就真的运行成功了!

996021dbbf8cc69cf61522bd14e1fda.png

可恶,这对于懒人cv真是个小坑。

二、寻找回忆中的Minio

minio成功在docker上运行起来了,正当我要访问的时候,访问失败。

2.1 发现问题

怎么会访问不了呢?端口映射了,防火墙也关了,访问不了也算了,还有一个奇怪的现状是我明明输入的是9000端口,可它却自动给我跳到41757这个陌生的端口上。

8dde74cb0a2f84977425ac1c20e0eb1.png

感觉他访问我9000不通,于是就自动跳到41757端口上。

2.2 尝试找到问题所在

连忙查下日志。

466da452de526c191b5f327842f4c22.png

❓ 会不会是新版本不一样了?

2.3 有点小思路

因为之前拉取的minio已经是半年前了,查了更新记录也确实是有更新版本。

查询minio服务版本:docker search minio

6fdc06bb41fe4d83bba3f1f00b73d591~tplv-k3u1fbpfcp-watermark.awebp.jpg

新版本升级太快了,于是找到旧版本,建议大家选择minio/minio:RELEASE.2021-06-17T00-10-46Z这个版本,因为其他版本坑也挺多的。

通过以上的坑,我们发现minio的版本更新迭代特别快,最新版本的已经变得面目全非,不认识了。我查阅了最新官网发布版本。

8cfbbc6236484a339bf7ceb0340e1580~tplv-k3u1fbpfcp-watermark.awebp.jpg

大大小小已经发布了200多个版本了。

我们选择的2021年6月17号

2.4 实战一下

可能找到问题所在,那就来试一下。

2.4.1 拉取minio镜像

docker pull minio/minio:RELEASE.2021-06-17T00-10-46Z 复制代码

034e6ddea3c84a878ae470e17c5707f3~tplv-k3u1fbpfcp-watermark.awebp.jpg

2.4.2 启动

docker run -p 9000:9000 minio/minio:RELEASE.2021-06-17T00-10-46Z server /data // 或者自定义账号密码 docker run -p 9000:9000 --name minio -d  -e "MINIO_ACCESS_KEY=admin"  -e "MINIO_SECRET_KEY=123456"  -v /home/minio:/data  -v /home/minio/config:/root/.minio  minio/minio:RELEASE.2021-06-17T00-10-46Z  server /data 复制代码

42543016e10fd8afb56011ac35d5927.png

T喵的,跑起来了!

3.png

果然是版本的问题,版本升级太快了,还好找到了旧版本。

三、MINIO_ACCESS_KEY和MINIO_SECRET_KEY已弃用?

今天悠哉悠哉,就想起登录一下minio看看我的音乐文件在里面怎么样。

结果登录的时候提示:Authentication failed, check your access credentials

于是赶紧查下日志看看有没有什么有用的报错信息。

警告:MINIO_ACCESS_KEY和MINIO_SECRET_KEY已弃用。 请使用MINIO_ROOT_USER和MINIO_ROOT_PASSWORD 复制代码

说run的时候MINIO_ACCESS_KEY和MINIO_SECRET_KEY已弃用了, 要使用新的MINIO_ROOT_USER和MINIO_ROOT_PASSWORD去设置账号密码。

于是我停止了我的minio服务,打算换个run命令。

新的命令:

docker run -p 9000:9000 --name minio -d  -e "MINIO_ROOT_USER=admin"  -e "MINIO_ROOT_PASSWORD=123456"  -v /home/minio:/data  -v /home/minio/config:/root/.minio  minio/minio:RELEASE.2021-06-17T00-10-46Z  server /data 复制代码

可当我使用新的命令跑的时候,报了另外一个错误。

‘ server’ is not a minio sub-command. See ‘minio --help’

41de059d693048313358b9ded813444.png

当您使用不是 minio 命令的参数运行 minio 命令时,这会显示。

1d1148f017856f488b4f4dafcbfd821b.jpeg

不是说MINIO_ACCESS_KEY和MINIO_SECRET_KEY已弃用了, 要使用新的MINIO_ROOT_USER和MINIO_ROOT_PASSWORD去设置账号密码吗?

怎么就不是新的minio命令参数了。

查了之后也找不到其他解决方法,就想着之前2.4.2 启动也是简单启动一下minio服务。

docker run -p 9000:9000 minio/minio:RELEASE.2021-06-17T00-10-46Z server /data 复制代码

然后启动成功了,于是我重新跑一下之前的命令。

docker run -p 9000:9000 --name minio -d  -e "MINIO_ACCESS_KEY=admin"  -e "MINIO_SECRET_KEY=123456"  -v /home/minio:/data  -v /home/minio/config:/root/.minio  minio/minio:RELEASE.2021-06-17T00-10-46Z  server /data 复制代码

跑起来了,minio管理页面也可以登录上去了,说好的MINIO_ACCESS_KEY和MINIO_SECRET_KEY已弃用呢?

莫名其妙报错了,还好我的nginx设置了资源缓存,浏览器就可以缓存资源(30天)。

4.png

from disk cache,还好有缓存资源,不会导致音乐模块的图片在minio服务有问题时加载不出来。

还有一个现象是:minio管理界面登录不进去(报错的时候),但访问资源还是可以访问的,说明服务并没有挂。

四、putObject图片后,图片加载不了????

4.1 发现问题

着重讲一个JavaScript中的putObject方法,正当我用koa2使用着minio的这个方法上传文件,发现文件上传完后,前端获取链接竟然无法正常显示。

4.2 核对官方例子

先贴下minio的方法说明。

fd7c5f919860f961eccb37e3c5b031c.png

在看一下实际代码中如何调用。

直接拿官方例子代码使用。

var Fs = require('fs') var file = '/tmp/40mbfile' var fileStream = Fs.createReadStream(file) var fileStat = Fs.stat(file, function(err, stats) {   if (err) {     return console.log(err)   }   minioClient.putObject('mybucket', '40mbfile', fileStream, stats.size, function(err, objInfo) {       if(err) {           return console.log(err) // err should be null       }    console.log("Success", objInfo)   }) }) 复制代码

图片上传成功,官网例子果然没有让我失望,于是我顺理成章返回给前端图片的URL显示。

发现却显示不了?

ca679607280d06c3c9693b0e10e3dba0.jpg

检查了一下,原来是链接没写端口号,粗心了啊。

加上之后,还是显示不了?

4.3 JavaScript上传图片和其他图片图标不一样

打开minio管理界面确认是不是加上去了。

69820822d23134b1817cf0d6d8bcbc1.png

❓ 怎么我上传的875.jpg和别的图片不一样?

????其他不是灰色的图片是我手动点击加号手动上传上去。

4.4 抄一下java如何写的(之前有写过,确定成功过)

自己通过koa2上传则是灰色的,灵机一动,之前java写过上传音乐模块putObject方法代码,去看看java是怎么写的。

java代码如下:

MinioUtils.putObject(     singerSong.getBucketName(),      objectName,      file.getInputStream(),      file.getSize(),      file.getContentType() ); 复制代码

而上面的JavaScript如下:

minioClient.putObject(     'mybucket',      '40mbfile',      fileStream,      stats.size ) 复制代码

对比了一下,JavaScript没有传文件的类型,而java有传,怪不得minio管理界面没有显示文件的类型,原来是我没写。

难道是我写漏了?官网再走一波。

T瞄的,我的代码就是从官网例子复制过来的。例子并没有传文件类型。

只能从官网上的metaData这个参数下手了,可能就是文件类型。

7b6e769e0c0bf74c1887ee3eb64659e.png

然而不知道元数据是什么,官网也没有说,怎么传,有点小坑。

????寻找解决问题之路。

4.5 少传ContentType参数?

有一个人跟我一样,也是发现这个问题,说进该方法类仔细看了一下,好家伙居然方法偷偷改过了但是官网还没改,于是他说多传ContentType参数就可以了。

e89ec6f05611349a8dfa7f462bc2545.png

于是我也去看了下putObject源码:

66178a20bdb353b3c4f7a776e5c59a8.png

并没有看到我想看到的ContentType参数。

4.6 改下源码?

好家伙,有人说直接改源码,确实是一个办法,不过这是被逼无奈才选择的下策,再找找吧。

4.7 官方例子说了 == 白说?

minio官方github也发现了这个问题,说多传content-type就可以解决,我也知道多传,那到底怎么传呢?

没说。

反正没有设置文件类型,把url放在浏览器,就会直接下载,如果类型正确,是可以预览的,不会一来就给你下载。

85e46acf0a617bb1f12bbd48ac257a1.png

4.8 元数据参数得以解释

直到我看到这篇。说什么不重要,重要的是metaData有人使用了。

6aeff8905e1d0184a8393436004fcb4.png

我的代码改造如下:

var Fs = require('fs') var file = '/tmp/40mbfile' var fileStream = Fs.createReadStream(file) var fileStat = Fs.stat(file, function(err, stats) {   if (err) {     return console.log(err)   }   minioClient.putObject(   'mybucket',    '40mbfile',    fileStream,    stats.size,    {'Content-Type': type}, // 这个type从前端上传的file对象可以获得   function(err, objInfo) {       if(err) {           return console.log(err) // err should be null       }        console.log("Success", objInfo)   }) }) 复制代码

成功了,前端可以正常显示了,minio管理界面也正常显示图片类型图标。

最后

不经历风雨,怎么见彩虹。

重构了,总会有所收获,有所成长,在线音乐希望越来越好,会不断更新,直到干不动了。

记得实习公司的时候,同一个学校的师兄跟我说:代码不建议cvcv,要多手打,才会记住,在这次minio使用过程中(一、cv出问题了?),已深刻明白了,以后开发中会刻意手打。

上传到master稳定版本的时候真的是最稳定的版本吗?啊,minio。(二、寻找回忆中的Minio

这次实战中也知道缓存的重要性,如果程序崩了,浏览器还设置了30天的缓存时间,不会马上给客户视觉上的憎恨,当然,强制刷新就当我没说????。(三、MINIO_ACCESS_KEY和MINIO_SECRET_KEY已弃用?

问题存在并不可怕,可怕的是你真的认真认真查过问题了吗,别一来就改源码,会不会是我们使用的方式不对呢。(四、putObject图片后,图片加载不了

如果对您有帮助,你的点赞是我前进的润滑剂。

作者:git-Dignity
链接:https://juejin.cn/post/7015157578850123807

文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐