// 拉取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
遇到错不要慌,先找下有用过的人。
好,我都懂的。一个人也很好的。
于是我百度了一遍,其中有一篇给了我灵感。
他的意思是说:在win开发的脚本,需要转换一下格式。
因为我的那串长长的docker run minio ...
命令是从dos文档上复制过来的,直接拷到linux上可能有编码上的问题,于是我怀着猜测的心态去手敲了一遍,竟然,竟然就真的运行成功了!
可恶,这对于懒人cv真是个小坑。
二、寻找回忆中的Minio
minio成功在docker上运行起来了,正当我要访问的时候,访问失败。
2.1 发现问题
怎么会访问不了呢?端口映射了,防火墙也关了,访问不了也算了,还有一个奇怪的现状是我明明输入的是9000端口,可它却自动给我跳到41757这个陌生的端口上。
感觉他访问我9000不通,于是就自动跳到41757端口上。
2.2 尝试找到问题所在
连忙查下日志。
❓ 会不会是新版本不一样了?
2.3 有点小思路
因为之前拉取的minio已经是半年前了,查了更新记录也确实是有更新版本。
查询minio服务版本:docker search minio
新版本升级太快了,于是找到旧版本,建议大家选择minio/minio:RELEASE.2021-06-17T00-10-46Z
这个版本,因为其他版本坑也挺多的。
通过以上的坑,我们发现minio的版本更新迭代特别快,最新版本的已经变得面目全非,不认识了。我查阅了最新官网发布版本。
大大小小已经发布了200多个版本了。
我们选择的2021年6月17号。
2.4 实战一下
可能找到问题所在,那就来试一下。
2.4.1 拉取minio镜像
docker pull minio/minio:RELEASE.2021-06-17T00-10-46Z
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
T喵的,跑起来了!
果然是版本的问题,版本升级太快了,还好找到了旧版本。
三、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’
当您使用不是 minio 命令的参数运行 minio 命令时,这会显示。
不是说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天)。
from disk cache
,还好有缓存资源,不会导致音乐模块的图片在minio服务有问题时加载不出来。
还有一个现象是:minio管理界面登录不进去(报错的时候),但访问资源还是可以访问的,说明服务并没有挂。
四、putObject图片后,图片加载不了💔
4.1 发现问题
着重讲一个JavaScript中的putObject
方法,正当我用koa2使用着minio的这个方法上传文件,发现文件上传完后,前端获取链接竟然无法正常显示。
4.2 核对官方例子
先贴下minio的方法说明。
在看一下实际代码中如何调用。
直接拿官方例子代码使用。
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)
console.log("Success", objInfo)
图片上传成功,官网例子果然没有让我失望,于是我顺理成章返回给前端图片的URL显示。
发现却显示不了?
检查了一下,原来是链接没写端口号,粗心了啊。
加上之后,还是显示不了?
4.3 JavaScript上传图片和其他图片图标不一样
打开minio管理界面确认是不是加上去了。
❓ 怎么我上传的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这个参数下手了,可能就是文件类型。
然而不知道元数据是什么,官网也没有说,怎么传,有点小坑。
🙋寻找解决问题之路。
4.5 少传ContentType参数?
有一个人跟我一样,也是发现这个问题,说进该方法类仔细看了一下,好家伙居然方法偷偷改过了但是官网还没改,于是他说多传ContentType参数就可以了。
于是我也去看了下putObject源码:
并没有看到我想看到的ContentType参数。
4.6 改下源码?
好家伙,有人说直接改源码,确实是一个办法,不过这是被逼无奈才选择的下策,再找找吧。
4.7 官方例子说了 == 白说?
minio官方github也发现了这个问题,说多传content-type就可以解决,我也知道多传,那到底怎么传呢?
反正没有设置文件类型,把url放在浏览器,就会直接下载,如果类型正确,是可以预览的,不会一来就给你下载。
4.8 元数据参数得以解释
直到我看到这篇。说什么不重要,重要的是metaData有人使用了。
我的代码改造如下:
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},
function(err, objInfo) {
if(err) {
return console.log(err)
console.log("Success", objInfo)
成功了,前端可以正常显示了,minio管理界面也正常显示图片类型图标。
五、桶名切记不可大写
创建桶的时候,发现怎么老是报错,最后竟然是名字(itKnowledge)有问题,不能大写。
大家记得看官网介绍呀!
不经历风雨,怎么见彩虹。
重构了,总会有所收获,有所成长,在线音乐希望越来越好,会不断更新,直到干不动了。
记得实习公司的时候,同一个学校的师兄跟我说:代码不建议cvcv,要多手打,才会记住,在这次minio使用过程中(一、cv出问题了?),已深刻明白了,以后开发中会刻意手打。
上传到master稳定版本的时候真的是最稳定的版本吗?啊,minio。(二、寻找回忆中的Minio)
这次实战中也知道缓存的重要性,如果程序崩了,浏览器还设置了30天的缓存时间,不会马上给客户视觉上的憎恨,当然,强制刷新就当我没说😁。(三、MINIO_ACCESS_KEY和MINIO_SECRET_KEY已弃用?)
问题存在并不可怕,可怕的是你真的认真认真查过问题了吗,别一来就改源码,会不会是我们使用的方式不对呢。(四、putObject图片后,图片加载不了)
如果对您有帮助,你的点赞是我前进的润滑剂。
Docker -minio安装使用
Docker安装Minio,填满最新版大坑
Heroku: deploying minio server with Dockerfile CMD failure
[BUG] 上传到 minio 的时候没有设置content-type #129
使用minio接口里上传的图片无法在管理界面预览,直接在管理界面上传的图片可以预览
VUE无法直接上传文件到MinIO,提示 _fs.default.stat is not a function ?
有请Minio统一管理文件(实操JS、JAVA)
尤大大说我的代码全部不加分号
老湿说的万物皆对象,你也信?
Vue-Cli3搭建组件库
Vue实现动态路由(和面试官吹项目亮点)
项目中你不知道的Axios骚操作(手写核心原理、兼容性)
VuePress搭建项目组件文档
koa2+vue+nginx部署
vue-typescript-admin-template后台管理系统
juejin.cn/post/701515…