背景
上一篇写的使用“Linux使用shell脚本实现目录创建与文件传输”的方式实现上传minio服务器的方案,审核不通过,需要换成mc的方式。
安装并运行
我这里使用的是docker的方式:
[root@zxj ~]# docker pull minio/mc
运行拉取下来的镜像,创建容器:
[root@zxj ~]# docker run -it --entrypoint=/bin/sh minio/mc
然后再运行容器的时候,报了一个错:
> WARNING: IPv4 forwarding is disabled. Networking will not work.
1. 解决方案:
删除掉之前运行的程序,然后执行命令:
vi /etc/sysctl.conf
2. 然后再文件中添加:
net.ipv4.ip_forward=1
3. 重启network服务
systemctl restart network && systemctl restart docker
4. 查看是否成功:
[root@zxj ~]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
如果返回的是1,则代表成功了。
再次运行镜像创建容器:
[root@zxj ~]# docker run -it --entrypoint=/bin/sh minio/mc
运行后直接进入容器,就可以在内运行 mc
命令了。
连接minio服务器
在容器内执行命令,并且能看到成功的提示:
sh-4.4# mc config host add minio http://192.168.xx.xx:9000 username password --api s3v4
mc: Configuration written to `/root/.mc/config.json`. Please update your access credentials.
mc: Successfully created `/root/.mc/share`.
mc: Initialized share uploads `/root/.mc/share/uploads.json` file.
mc: Initialized share downloads `/root/.mc/share/downloads.json` file.
Added `minio` successfully.
其中add 后面的参数为远程minio服务器的别名,后面连接的时候能用的到,紧接着是 IP地址,IP地址之后是minio服务器的账号和密码,最后的–api为签名(可选项 默认为 s3v4)。
一些简单的命令
- 连接成功之后可以
mc ls + minio别名
查看minio服务器下的桶:
sh-4.4# mc ls minio
- 查询桶下的文件:
mc ls minio/sonardown
其中minio是 minio云服务器的别名,后面的sonardown为桶的名称。
- 给文件生成临时下载URL
mc share download minio//sonardown/zhangxujiexitong/zxjPipeline/1608456352427/
注意,默认为7天
- 文件系统和对象存储之间做同步
sh-4.4# mc mirror /root/ minio/sonardown/
把root文件夹下的文件同步到minio服务服务器的某个桶上。
- 再minio服务器上创建桶 或 目录
sh-4.4# mc mb minio/zhangxujietest/45678/rrrr
- 拷贝一个文件上传至minio服务器
sh-4.4# mc cp /app/data/mytest.txt minio/zhangxujietest/45678/rrrr/
mc实现文件上传
由于是docker启动的容器,现在想要实现mc上传文件至minio服务器,我认为第一步就是再启动容器之前建立一个和容器对应的数据卷,这样才方便上传数据,我这里测试建立文件夹:
mkdir -p /app/data/
vi mytest.txt
然后删除之前启动好的容器,从新建立绑定数据卷的容器:
docker run -v /app:/app -it --entrypoint=/bin/sh minio/mc
自动进入容器,然后看到容器内的根目录同样有一个/app/data/mytest.txt
的文件,表示同步成功,现在要做的就是把这个txt文件上传至minio服务器。
由于是从新建立的容器,因此需要从新使用
mc config host add minio http://192.168.xx.xx:9000 username password --api s3v4
命令和minio服务器建立关系。
执行命令传输文件:
mc cp /app/data/mytest.txt minio/zhangxujietest/45678/rrrr/
然后在minio服务器中即可看到该文件。
变为shell脚本
接下来就是把这些命令变成shell脚本了。。
此处踩坑 一小时 - - !
坑1 :
我用Notepad++编辑器在windows上编辑的脚本,拉到 linux 上运行报错:
-bash: ./uploadfile.sh: /bin/sh^M: 坏的解释器: 没有那个文件或目录
原因: Windows系统中的换行符是**\n\r**,Linux系统中的换行符是**\n**,因此需要将**\r**替换为空白。
解决方案:
# sed -i 's/\r$//' xxx.sh
坑2:
脚本中执行docker命令,-c参数 要使用双引号,不然会获取不到 脚本中的动态参数。
最终脚本:
#!/bin/sh
source_file=$1
target_path=$2
echo "docker exec -it 55924203cd8b /bin/bash -c 'mc cp ${source_file} ${target_path}'"
docker exec -it 55924203cd8b /bin/sh -c "mc cp ${source_file} ${target_path}"
运行脚本:
./uploadfile.sh /app/shell/zhangxujie.txt minio/zhangxujietest/45678/rrrr/
执行成功。